Mendapatkan FormKey yang benar

18

Saya punya halaman yang saya daftarkan produk, itu saja. Ini semacam catalog/view.phtmlklon. Termasuk saja app/Mage.php.

Di halaman ini saya gunakan

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

tetapi berbeda dengan formKey halaman lain

Apa yang saya lakukan salah?

Ibrahim Mumcu
sumber

Jawaban:

17

Mungkin apa-apa karena kunci bentuk acak, sehingga memiliki menjadi berbeda setiap kali.

Jadi seharusnya tidak membuat perbedaan, tetapi praktik terbaik, bagaimana Anda harus menambahkan input kunci form ke template Anda, adalah ini:

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

Pembaruan: Saya harus mengakui, saya salah dalam satu hal: Kunci formulir tetap sama selama sesi. Jika Anda memiliki kunci formulir yang berbeda di halaman yang berbeda, ini mungkin menjadi masalah dengan cache halaman penuh pihak ketiga yang menyertakan kunci formulir di cache (yang seharusnya tidak), atau kunci formulir berada di dalam blok khusus yang menggunakan blok cache. Untuk yang terakhir, saya menemukan solusi: Blok cache yang berisi form_key (yaitu konten dinamis)

Fabian Schmengler
sumber
ini kira menghasilkan output input tersembunyi? tapi saya tidak bisa meletakkannya di review.phtml saya? ada pemikiran?
Gantung
Ya dan Anda harus dapat melakukannya di blok mana pun di halaman mana pun. getBlockHtml() diimplementasikan dalam Mage_Core_Block_Abstractdan formkeyblok didefinisikan dalambase/default/layout/core.xml
Fabian Schmengler
Saya tidak bisa mendapatkannya untuk output bahkan dalam instal 1,8 bersih. tapi saya hardcode ini <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Tampaknya untuk memperbaikinya, tetapi masih membuat frustrasi. apakah ada cara yang lebih baik?
Mengayun
3
Mengapa kunci formulir harus berbeda setiap kali? Itu harus sama untuk sesi yang diberikan pada halaman mana pun; seharusnya hanya bervariasi berdasarkan sesi yang berbeda.
Nick Rolando
Saya setuju bahwa itu tidak benar-benar diperlukan tetapi ini adalah cara kerjanya di Magento.
Fabian Schmengler
8

Saya tahu pertanyaan yang tidak jelas ini seharusnya tidak dijawab. Namun saya mungkin mengalami masalah yang sama di sini, inilah yang saya pelajari:

  • form_key tidak boleh berbeda dalam setiap permintaan
  • form_key konsisten sepanjang sesi
  • sesi yang berbeda harus membuat form_key yang berbeda (coba browser lain)
  • yang HALAMAN CACHE tidak kadang-kadang mengganggu ini
  • dengan saya ini menghasilkan Widget yang menunjukkan form_key (cache) yang sama untuk semua sesi.
    • saya tidak mendapatkan "fitur" ini

Berdasarkan contoh singkat saya karena itu telah menimpa tindakan checkout addtocart seperti ini di Modul baru:

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>

Saya harap ini akan cukup luas bagi semua orang untuk menciptakan ini

Summer-Sky
sumber
+1 untuk "PAGE CACHE terkadang mengganggu ini". Inilah alasan mengapa saya tidak bisa menambahkan produk ke wishlist. Kami menggunakan cache halaman Varnish, dan itu adalah caching kunci form.
Nick Rolando
1

Tidak dapat berkomentar jadi saya menjawab sebagai gantinya. Jangan menambahkan kunci formulir di controller. Ini menonaktifkan manfaat keamanan kunci formulir. Jika Anda menggunakan Varnish, Anda dapat menggunakan ESI (Termasuk Sisi Tepi) untuk menambahkan kunci. Anda harus menyimpannya di cookie agar bisa berfungsi.

Björn Tantau
sumber
Bisakah Anda memberikan contoh bagaimana tampilan instruksi ESI Anda untuk blok formkey?
DarkCowboy
Anda harus bisa mendapatkan itu dari ekstensi Cache Medie Varnish Phoenix. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau