获取正确的FormKey


18

我有一个页面列出了产​​品,仅此而已。它的catalog/view.phtml克隆。只是包括在内app/Mage.php

在此页面中,我使用

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

但这与其他页面的formKey不同

我究竟做错了什么?

Answers:


17

可能没什么,因为形式的关键是随机的,所以它具有每次都不同。

因此,这没有什么区别,但是最佳实践是如何将表单键输入添加到模板中,它是:

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

更新:我必须承认,我在某一点上是错的:在一个会话中,表单键保持不变。如果您在不同页面上具有不同的表单键,则这可能是第三方全页缓存(在缓存中包含表单键)(它不应包含)的问题,或者该表单键位于正在使用块的自定义块中缓存。对于后者,我找到了一个解决方案:包含form_key(即动态内容)的缓存块


这想输出一个隐藏的输入表单吗?但我不能把它放在我的review.phtml上吗?任何想法?
wlin

是的,您应该可以在任何页面的任何块中进行操作。getBlockHtml() 在被实现Mage_Core_Block_Abstractformkey块在定义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,2015年

8

我知道这个模糊的问题不应该回答。但是我可能在这里遇到了类似的问题,这是我所学到的:

  • 每个请求中的form_key不得相同
  • 在整个会话中,form_key是一致的
  • 不同的会话应创建不同的form_key(尝试使用其他浏览器)
  • 所述页缓存有时确实与该干扰
  • 对我来说,这导致在所有会话中显示相同(缓存)form_key的小部件。
    • 我没有这个“功能”

因此,基于简短的示例,我在新模块中重写了addtocart checkout操作,如下所示:

应用程序/代码/本地/名称/结帐/控制器/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>

我希望这将足以使所有人重新创建它


+1表示“ PAGE CACHE有时会对此干扰”。这就是为什么我无法将产品添加到愿望清单的原因。我们正在使用Varnish页面缓存,并且正在缓存表单键。
Nick Rolando

1

无法发表评论,因此我正在回答。不要在控制器中添加表单键。它禁用了表单密钥的安全性。如果您使用的是清漆,则可以使用ESI(边缘包括)来添加密钥。您必须将其保存在Cookie中才能正常工作。


您能否提供一个例子,您的ESI指令对formkey块的外观如何?
DarkCowboy

您应该能够从Phoenix Medie Varnish Cache扩展中获取该信息。github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
比约恩Tantau
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.