올바른 FormKey 얻기


18

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

이 페이지에서 나는

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

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

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

답변:


17

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

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

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

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


이것은 숨겨진 입력 양식을 출력한다고 가정합니까? 하지만 내 review.phtml에 넣을 수 없습니까? 어떤 생각?
wlin

예, 어느 페이지에서나 블록으로 할 수 있어야합니다. getBlockHtml() 에 구현 Mage_Core_Block_Abstract하고 formkey블록에 정의되어 있습니다base/default/layout/core.xml
파비안 Schmengler

깨끗한 1.8 설치로도 출력 할 수 없습니다. 그러나 나는 이것을 하드 코딩 <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>했다. 그것을 고치는 것처럼 보였지만 여전히 좌절했다. 더 좋은 방법이 있습니까?
wlin

3
매번 양식 키가 달라야하는 이유는 무엇입니까? 모든 페이지에서 주어진 세션에 대해 동일해야합니다. 세션마다 다를 수 있습니다.
Nick Rolando

실제로 필요하지는 않지만 Magento에서 작동하는 방식입니다.
Fabian Schmengler

8

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

  • 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>

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


"PAGE CACHE가 때때로 이것을 방해합니다"+1 위시리스트에 제품을 추가 할 수없는 이유입니다. Varnish 페이지 캐싱을 사용하고 있으며 양식 키를 캐싱하고 있습니다.
Nick Rolando

1

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


formkey 블록에 대한 ESI 명령어의 모양을 예를 들어 설명해 주시겠습니까?
DarkCowboy

Phoenix Medie Varnish Cache 확장에서 얻을 수 있어야합니다. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.