Ottenere FormKey corretto


18

Ho una pagina in cui ho elencato i prodotti, tutto qui. È un tipo di catalog/view.phtmlclone. Appena incluso app/Mage.php.

In questa pagina che uso

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

ma è diverso dal modulo di un'altra pagina Chiave

Che cosa sto facendo di sbagliato?

Risposte:


17

Probabilmente niente perché la chiave del modulo è casuale, quindi deve essere diversa ogni volta.

Quindi non dovrebbe fare la differenza, ma la procedura migliore, come aggiungere l'input della chiave del modulo al modello, è questa:

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

Aggiornamento: Devo ammettere che ho sbagliato in un punto: la chiave del modulo rimane la stessa durante una sessione. Se si dispone di una chiave del modulo diversa su pagine diverse, questo potrebbe essere un problema con una cache di pagina intera di terze parti che include la chiave del modulo nella cache (cosa che non dovrebbe), oppure la chiave del modulo si trova all'interno di un blocco personalizzato che utilizza il blocco cache. Per quest'ultimo, ho trovato una soluzione: blocchi di cache che contengono form_key (ovvero contenuto dinamico)


questo suppone di produrre un modulo di input nascosto? ma non riesco a metterlo sul mio review.phtml? qualche pensiero?
wlin,

Sì e dovresti essere in grado di farlo in qualsiasi blocco su qualsiasi pagina. getBlockHtml() è implementato in Mage_Core_Block_Abstracte il formkeyblocco è definito inbase/default/layout/core.xml
Fabian Schmengler

Non riesco ad ottenere l'output nemmeno in una versione 1.8 pulita. ma ho inserito questo codice <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Sembra risolverlo, ma è comunque frustrante. C'è un modo migliore.
wlin,

3
Perché la chiave del modulo dovrebbe essere diversa ogni volta? Dovrebbe essere lo stesso per una determinata sessione su qualsiasi pagina; dovrebbe variare solo da sessioni diverse.
Nick Rolando,

Concordo sul fatto che non è davvero necessario ma è così che funziona in Magento.
Fabian Schmengler,

8

So che a questa vaga domanda non dovrebbe essere data risposta. Tuttavia, potrei essermi imbattuto in un problema simile qui, questo è quello che ho imparato:

  • il form_key non deve essere diverso in ogni richiesta
  • il form_key è coerente per tutta la sessione
  • una sessione diversa dovrebbe creare un form_key diverso (provare un altro browser)
  • la PAGINA CACHE a volte interferisce con questo
  • con me questo ha portato a un Widget che mostra lo stesso form_key (memorizzato nella cache) per tutte le sessioni.
    • non ho questa "caratteristica"

Sulla base di un breve esempio, ho quindi ignorato l'azione di checkout addtocart in questo modo in un nuovo modulo:

app / code / local / name / Acquista / 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 / Nome / 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>

Spero che questo sia ampiamente sufficiente per consentire a tutti di ricrearlo


+1 per "la PAGINA CACHE a volte interferisce con questo". Questo è il motivo per cui non riesco ad aggiungere prodotti alla lista dei desideri. Stiamo usando la memorizzazione nella cache di Varnish page, e sta memorizzando nella cache le chiavi del modulo.
Nick Rolando,

1

Non posso commentare, quindi sto rispondendo invece. Non aggiungere la chiave del modulo nel controller. Disabilita i vantaggi di sicurezza della chiave del modulo. Se stai usando Varnish puoi usare ESI (Edge Side Includes) per aggiungere la chiave. Dovrai salvarlo in un cookie affinché funzioni.


Potresti fornire un esempio di come apparirebbero le tue istruzioni ESI per il blocco formkey?
DarkCowboy,

Dovresti essere in grado di ottenerlo dall'estensione Phoenix Medie Varnish Cache. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.