正しい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_Abstractformkeyブロックが定義されますbase/default/layout/core.xml
ファビアンシュメングラー

1.8のクリーンインストールでも出力できません。しかし、私はこれをハードコード<input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>します。それを修正するようですが、それでもいらいらさせます。より良い方法はありますか。
wlin

3
なぜフォームキーは毎回異なるのですか?どのページの特定のセッションでも同じである必要があります。セッションによってのみ異なるはずです。
ニックロランド

私はそれが本当に必要ではないことに同意しますが、これはMagentoでどのように機能するかです。
ファビアンシュメングラー

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ページキャッシュを使用しており、フォームキーをキャッシュしています。
ニックロランド

1

コメントできないので、代わりに答えています。コントローラーにフォームキーを追加しないでください。フォームキーのセキュリティ上の利点を無効にします。Varnishを使用している場合は、ESI(Edge Side Includes)を使用してキーを追加できます。これを機能させるには、Cookieに保存する必要があります。


formkeyブロックのESI命令をどのように見えるかの例を提供できますか?
ダークカウボーイ

Phoenix Medie Varnish Cache拡張機能から取得できるはずです。github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
ビョルンTantau
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.