Richtigen FormKey erhalten

18

Ich habe eine Seite, auf der ich Produkte aufgelistet habe, das wars. Es ist eine Art catalog/view.phtmlKlon. Nur enthaltenapp/Mage.php .

Auf dieser Seite verwende ich

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

aber es ist anders als der formKey einer anderen Seite

Was mache ich falsch?

Ibrahim Mumcu
quelle

Antworten:

17

Wahrscheinlich nichts, weil der Formularschlüssel zufällig ist und jedes Mal anders sein muss.

Es sollte also keinen Unterschied machen, aber die beste Vorgehensweise, wie Sie die Eingabe des Formularschlüssels zu Ihrer Vorlage hinzufügen sollten, ist folgende:

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

Update: Ich muss zugeben, ich habe mich in einem Punkt geirrt: Der Formularschlüssel bleibt während einer Sitzung gleich. Wenn Sie auf verschiedenen Seiten einen anderen Formularschlüssel haben, liegt möglicherweise ein Problem mit einem ganzseitigen Cache eines Drittanbieters vor, der den Formularschlüssel im Cache enthält (was nicht der Fall sein sollte), oder der Formularschlüssel befindet sich in einem benutzerdefinierten Block, der den Block verwendet Zwischenspeicher. Für letzteres habe ich eine Lösung gefunden: Cache-Blöcke, die form_key enthalten (dh dynamischer Inhalt)

Fabian Schmengler
quelle
Dies soll ein verstecktes Eingabeformular ausgeben? aber ich kann es nicht in meine review.phtml schreiben? jeder Gedanke?
Wlin
Ja, und Sie sollten es in jedem Block auf jeder Seite tun können. getBlockHtml() ist implementiert in Mage_Core_Block_Abstractund der formkeyBlock ist definiert inbase/default/layout/core.xml
Fabian Schmengler
Ich kann es nicht einmal in einer sauberen 1.8-Installation zum Ausgeben bringen. aber ich codiere es fest <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>ein. Scheint es zu beheben, aber immer noch frustrierend. gibt es einen besseren weg.
Wlin
3
Warum sollte der Formularschlüssel jedes Mal anders sein? Dies sollte für eine bestimmte Sitzung auf jeder Seite gleich sein. es sollte nur durch verschiedene Sitzungen variieren.
Nick Rolando
Ich bin damit einverstanden, dass es nicht wirklich notwendig ist, aber so funktioniert es in Magento.
Fabian Schmengler
8

Ich weiß, dass diese vage Frage nicht beantwortet werden sollte. Wie auch immer ich hier auf ein ähnliches Problem gestoßen bin, das habe ich gelernt:

  • Der form_key darf nicht in jeder Anfrage unterschiedlich sein
  • Der form_key ist während der gesamten Sitzung konsistent
  • Eine andere Sitzung sollte einen anderen form_key erstellen (versuchen Sie es mit einem anderen Browser)
  • die PAGE CACHE stört dies manchmal
  • Bei mir ergab sich ein Widget, das für alle Sitzungen denselben (zwischengespeicherten) form_key anzeigt.
    • Ich verstehe dieses "Feature" nicht

Anhand eines kurzen Beispiels ich daher die Aktion zum Auschecken von addtocarts wie folgt in einem neuen Modul überschrieben:

app / code / local / Name / Checkout / controller / 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>

Ich hoffe, dass dies so umfassend sein wird, dass jeder dies nachvollziehen kann

Sommerhimmel
quelle
+1 für "der PAGE CACHE stört dies manchmal". Aus diesem Grund kann ich keine Produkte zur Wunschliste hinzufügen. Wir verwenden das Varnish-Page-Caching und es cacht die Formularschlüssel.
Nick Rolando
1

Kann nicht kommentieren, also antworte ich stattdessen. Fügen Sie den Formularschlüssel nicht in den Controller ein. Dadurch werden die Sicherheitsvorteile des Formularschlüssels deaktiviert. Wenn Sie Lack verwenden, können Sie den Schlüssel mit ESI (Edge Side Includes) hinzufügen. Sie müssen es in einem Cookie speichern, damit es funktioniert.

Björn Tantau
quelle
Könnten Sie ein Beispiel geben, wie Ihre ESI-Anweisung für den Formkey-Block aussehen würde?
DarkCowboy
Sie sollten in der Lage sein, das von der Phoenix Medie Varnish Cache-Erweiterung zu erhalten. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau