Отримання правильного FormKey


18

У мене є сторінка, на якій я перелічив продукти, ось і все. Її catalog/view.phtmlклон. Просто включено app/Mage.php.

На цій сторінці я використовую

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

але це відрізняється від форми сторінки інших ключів

Що я роблю неправильно?

Відповіді:


17

Напевно , нічого , тому що ключ форми не є випадковим, так що має бути кожен раз різними.

Таким чином, це не повинно змінити значення, але найкраща практика, як слід додати ключ форми до вашого шаблону, це:

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

Оновлення: я мушу визнати, що я помилявся в одному пункті: клавіша форми залишається такою ж під час сеансу. Якщо у вас на різних сторінках інший ключ форми, це може бути проблемою з кешем сторонніх сторінок, який містить ключ форми в кеші (який він не повинен), або ключ форми знаходиться в спеціальному блоці, в якому використовується блок кеш. Для останнього я знайшов рішення: кеш-блоки, які містять form_key (тобто динамічний вміст)


це припустимо вивести приховану форму введення? але я не можу помістити його на свою review.phtml? якась думка?
wlin

Так, і ви повинні мати можливість це робити в будь-якому блоці на будь-якій сторінці. getBlockHtml() реалізовано в Mage_Core_Block_Abstractі formkeyблок визначений в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 (спробуйте інший браузер)
  • PAGE КЕШ іноді не заважає з цим
  • зі мною це призвело до того, що віджет показує однаковий (кешований) form_key для всіх сеансів.
    • я не отримую цієї "функції"

Виходячи з короткого прикладу, я таким чином змінив дію оформлення замовлення на додаток, як це в новому модулі:

додаток / код / ​​локальний / Ім'я / Замовлення / контролери / 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 / тощо / модулі / 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 для "СТОРІНЧИЙ КАШ іноді цьому заважає". Це справа, чому я не можу додавати товари до списку бажань. Ми використовуємо кешування сторінок Varnish, і це кешування клавіш форми.
Нік Роландо

1

Не можу коментувати, тому я відповідаю замість цього. Не додайте ключ форми в контролер. Він вимикає переваги безпеки ключа форми. Якщо ви використовуєте Varnish, ви можете використовувати ESI (Edge Side Includes), щоб додати ключ. Вам потрібно буде зберегти його у файлі cookie, щоб це працювало.


Чи можете ви навести приклад, як виглядатиме ваша інструкція ESI для блоку formkey?
DarkCowboy

Ви можете отримати це за допомогою розширення кеш-лаку Phoenix Medie. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.