올바른 FormKey 얻기 종류 .

제품을 나열한 페이지가 있습니다. catalog/view.phtml클론 의 종류 . 포함되어 있습니다 app/Mage.php.

이 페이지에서 나는

Mage::getSingleton('core/session')->getFormKey(); 

그러나 다른 페이지의 formKey와 다릅니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?



답변

이 때문에 아마 아무것도 형태의 키는 임의 없기 때문에 때마다 다를 수 있습니다.

따라서 차이가 없어야하지만 템플릿에 양식 키 입력을 추가하는 방법은 다음과 같습니다.

<?php echo $this->getBlockHtml('formkey') ?>

업데이트 : 인정해야합니다. 한 시점에서 잘못되었습니다 : 세션 중에 양식 키가 동일하게 유지됩니다. 다른 페이지에 다른 양식 키가있는 경우 캐시에 양식 키를 포함하거나 (사용해서는 안 됨) 양식 키가 블록을 사용하는 사용자 정의 블록 내에있는 타사 전체 페이지 캐시에 문제가있을 수 있습니다. 은닉처. 후자의 경우 해결책을 찾았습니다. form_key (동적 내용)가 포함 된 캐시 블록


답변

이 모호한 질문에 대답해서는 안된다는 것을 알고 있습니다. 그러나 여기서 비슷한 문제가 발생했을 수도 있습니다. 이것은 내가 배운 것입니다.

  • form_key는 각 요청에서 다를 수 없습니다
  • form_key는 세션 전체에서 일관됩니다.
  • 다른 세션은 다른 form_key를 만들어야합니다 (다른 브라우저를 사용해보십시오)
  • 페이지 캐시는 때때로이 방해 않습니다
  • 나와 함께 이것은 모든 세션에 대해 동일한 (캐시 된) form_key를 보여주는 위젯을 만들었습니다.
    • 나는이 “특징”을 얻지 못한다

짧은 예제를 기반으로 새 모듈에서 이와 같은 addtocart 체크 아웃 조치를 대체했습니다.

app / code / local / Name / Checkout / controllers / CartController.php

<?php
require_once(Mage::getModuleDir('controllers','Mage_Checkout').DS.'CartController.php');

class Name_Checkout_CartController extends Mage_Checkout_CartController
{
    public function addAction()
    {
        $request = $this->getRequest();
        $formKey = Mage::getSingleton('core/session')->getFormKey();
        $request->setParam('form_key', $formKey);
        return parent::addAction();
    }
}

app / code / local / Name / Checkout / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <version>0.1.0</version>
        </Name_Checkout>
    </modules>
    <frontend>
        <routers>
            <checkout>
                <args>
                    <modules>
                        <name_checkout before="Mage_Checkout">Name_Checkout</name_checkout>
                    </modules>
                </args>
            </checkout>>
        </routers>
    </frontend>
</config>

app / etc / modules / Name_Checkout.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Checkout/>
            </depends>
        </Name_Checkout>
    </modules>
</config>

나는 이것이 모두가 이것을 재현하기에 충분할 수 있기를 바랍니다.


답변

댓글을 달 수 없으므로 대신 대답하고 있습니다. 컨트롤러에 폼 키를 추가하지 마십시오. 폼 키의 보안 이점을 비활성화합니다. 광택을 사용하는 경우 ESI (Edge Side Includes)를 사용하여 키를 추가 할 수 있습니다. 쿠키가 작동하려면 쿠키에 저장해야합니다.