Uzyskiwanie poprawnego klucza FormKey

18

Mam stronę z listą produktów, to wszystko. To rodzaj catalog/view.phtmlklona. Właśnie dołączone app/Mage.php.

Na tej stronie używam

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

ale różni się od formularza innej strony

Co ja robię źle?

Ibrahim Mumcu
źródło

Odpowiedzi:

17

Prawdopodobnie nic, ponieważ klucz formularza jest losowy, więc za każdym razem musi być inny.

Dlatego nie powinno to mieć znaczenia, ale najlepszą praktyką dodawania klucza formularza do szablonu jest:

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

Aktualizacja: Muszę przyznać, że się myliłem w jednym punkcie: klucz formularza pozostaje taki sam podczas sesji. Jeśli masz inny klucz formularza na różnych stronach, może to być problem z zewnętrzną pamięcią podręczną pełnej strony, która zawiera klucz formularza w pamięci podręcznej (czego nie powinna mieć), lub klucz formularza znajduje się w niestandardowym bloku używającym bloku Pamięć podręczna. W przypadku tego drugiego znalazłem rozwiązanie: bloki pamięci podręcznej zawierające form_key (tj. Zawartość dynamiczną)

Fabian Schmengler
źródło
to ma na celu wygenerowanie ukrytego formularza wejściowego? ale nie mogę opublikować go w mojej review.phtml? jakiekolwiek myśli?
wlin
Tak i powinieneś być w stanie to zrobić w dowolnym bloku na dowolnej stronie. getBlockHtml() jest zaimplementowany w, Mage_Core_Block_Abstracta formkeyblok jest zdefiniowany wbase/default/layout/core.xml
Fabian Schmengler
Nie mogę uzyskać wyjścia nawet w czystej instalacji 1.8. ale wpisałem to na stałe <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Wydaje się, że to naprawić, ale wciąż frustrujące. czy jest lepszy sposób?
wlin
3
Dlaczego klucz formularza powinien być za każdym razem inny? Powinien być taki sam dla danej sesji na dowolnej stronie; powinien się różnić tylko w zależności od sesji.
Nick Rolando,
Zgadzam się, że tak naprawdę nie jest to konieczne, ale tak działa Magento.
Fabian Schmengler,
8

Wiem, że na to niejasne pytanie nie należy odpowiedzieć. Jednak mogłem tutaj natrafić na podobny problem, oto czego się nauczyłem:

  • klucz_formularza nie może być różny w każdym żądaniu
  • form_key jest spójny przez całą sesję
  • inna sesja powinna utworzyć inny klucz_format (spróbuj innej przeglądarki)
  • PAGE CACHE nie zakłóca to czasami
  • ze mną to spowodowało, że widżet wyświetlał ten sam (buforowany) klucz_formatowy dla wszystkich sesji.
    • nie dostaję tej „funkcji”

Dlatego na podstawie krótkiego przykładu zastąpiłem akcję kasowania addtocart w nowym module:

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>

Mam nadzieję, że będzie to wystarczająco dużo, aby każdy mógł to odtworzyć

Summer-Sky
źródło
+1 dla „DANYCH STRONY czasami przeszkadza”. Dzieje się tak dlatego, że nie mogę dodawać produktów do listy życzeń. Używamy buforowania stron Varnish i buforuje się klucze formularza.
Nick Rolando
1

Nie mogę komentować, więc odpowiadam. Nie dodawaj klucza formularza do kontrolera. Wyłącza korzyści bezpieczeństwa klucza formularza. Jeśli używasz Lakieru, możesz użyć ESI (Edge Side Includes), aby dodać klucz. Aby to zadziałało, musisz zapisać go w pliku cookie.

Björn Tantau
źródło
Czy możesz podać przykład, jak wyglądałaby twoja instrukcja ESI dla bloku formkey?
DarkCowboy,
Powinieneś być w stanie uzyskać to z rozszerzenia Phoenix Medie Varnish Cache. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau