Doğru FormKey alma


18

Ürünleri listelediğim bir sayfam var, hepsi bu. Bu tür bir catalog/view.phtmlklon. Sadece dahil app/Mage.php.

Bu sayfada kullanıyorum

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

ancak diğer sayfanın formundan farklı

Neyi yanlış yapıyorum?

Yanıtlar:


17

O kadar Muhtemelen hiçbir şey biçimli anahtar, rastgele olduğu için vardır her zaman farklı olmak.

Bu yüzden bir fark yaratmamalı, ancak form anahtarı girdisini şablonunuza nasıl eklemeniz gerektiği en iyi yöntem şudur:

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

Güncelleme: İtiraf etmeliyim ki, bir noktada yanılmışım: Form anahtarı oturum sırasında aynı kalır. Farklı sayfalarda farklı bir form anahtarınız varsa, bu önbellekteki form anahtarını içeren üçüncü taraf tam sayfa önbelleğiyle ilgili bir sorun olabilir (olmamalıdır) veya form anahtarı blok kullanan özel bir blok içinde olabilir önbelleği. İkincisi için bir çözüm buldum: form_key (yani dinamik içerik) içeren önbellek blokları


Bu gizli bir giriş formu çıktı varsayalım? ama benim review.phtml koymak olamıyorum? Herhangi bir düşünce?
wlin

Evet ve herhangi bir sayfadaki herhangi bir blokta yapabilmeniz gerekir. getBlockHtml() uygulandı Mage_Core_Block_Abstractve formkeyblok şu şekilde tanımlandıbase/default/layout/core.xml
Fabian Schmengler

Temiz bir 1.8 kurulumda bile çıktısını alamıyorum. ama ben <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>bunu kodlamak. Düzeltmek gibi görünüyor, ama yine de sinir bozucu. daha iyi bir yol var mı?
wlin

3
Form anahtarı neden her seferinde farklı olmalı? Herhangi bir sayfada belirli bir oturum için aynı olmalıdır; yalnızca farklı oturumlara göre değişmelidir.
Nick Rolando

Gerçekten gerekli olmadığına katılıyorum ama Magento'da böyle çalışıyor.
Fabian Schmengler

8

Bu belirsiz sorunun cevaplanmaması gerektiğini biliyorum. Ancak ben burada benzer bir sorunla karşılaşmış olabilir, ben öğrendim budur:

  • form_key her istekte farklı olmamalıdır
  • form_key oturum boyunca tutarlıdır
  • farklı bir oturumda farklı bir form_key oluşturulmalıdır (başka bir tarayıcı deneyin)
  • SAYFA ÖNBELLEK bazen bu müdahale etmez
  • benimle bu tüm oturumlar için aynı (önbellek) form_key gösteren bir Widget ile sonuçlandı.
    • bu "özelliği" alamadım

Kısa örneğe dayanarak, bu nedenle yeni bir Modülde bu gibi addtocart ödeme eylemini geçersiz kıldım:

Uygulamanın / kod / yerel / Ad / Ödeme / kontrolörleri / 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();
    }
}

Uygulamanın / kod / yerel / Ad / Ödeme / 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>

Uygulamanın / 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>

Umarım bu herkesin bunu yeniden yaratması için yeterli olacaktır


"SAYFA ÖNBELEME bazen buna müdahale eder" için +1. Bu, istek listesine ürün ekleyememe nedenim. Vernik sayfa önbelleğini kullanıyoruz ve form anahtarlarını önbelleğe alıyor.
Nick Rolando

1

Yorum yapamıyorum, bunun yerine cevap veriyorum. Form anahtarını denetleyiciye eklemeyin. Form anahtarının güvenlik avantajlarını devre dışı bırakır. Vernik kullanıyorsanız, anahtarı eklemek için ESI'yi (Kenar Tarafı İçerir) kullanabilirsiniz. Bunun çalışması için bir çerezde saklamanız gerekir.


Formkey bloğu için ESI talimatınızın nasıl görüneceğini gösteren bir örnek verebilir misiniz?
DarkCowboy

Bunu Phoenix Medie Varnish Cache uzantısından alabilmelisiniz. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.