รับ 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
Fabian Schmengler

ฉันไม่สามารถเอาท์พุทได้แม้จะอยู่ในสถานะ 1.8 สะอาด แต่ฉัน hardcode นี้<input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>ดูเหมือนจะแก้ไขได้ แต่ก็ยังน่าผิดหวัง มีวิธีที่ดีกว่า.
wlin

3
ทำไมคีย์ของฟอร์มจึงไม่เหมือนกันในแต่ละครั้ง มันควรจะเหมือนกันสำหรับเซสชั่นที่กำหนดในหน้าใด ๆ มันควรแตกต่างกันไปตามช่วงเวลาที่แตกต่างกัน
Nick Rolando

ฉันยอมรับว่ามันไม่จำเป็นจริงๆ แต่นี่เป็นวิธีการทำงานใน Magento
เฟเบียน Schmengler

8

ฉันรู้ว่าคำถามที่คลุมเครือนี้ไม่ควรตอบ อย่างไรก็ตามฉันอาจพบปัญหาที่คล้ายกันที่นี่นี่คือสิ่งที่ฉันได้เรียนรู้:

  • form_key ต้องไม่แตกต่างกันในแต่ละคำขอ
  • form_key สอดคล้องกันตลอดเซสชัน
  • เซสชั่นที่แตกต่างกันควรสร้าง form_key ที่แตกต่างกัน (ลองเบราว์เซอร์อื่น)
  • CACHE หน้าบางครั้งไม่ยุ่งเกี่ยวกับเรื่องนี้
  • กับฉันนี้ส่งผลให้เครื่องมือแสดง form_key (แคช) เดียวกันสำหรับทุกเซสชัน
    • ฉันไม่ได้รับ "คุณสมบัติ" นี้

จากตัวอย่างสั้น ๆฉันจึงได้แทนที่การดำเนินการชำระเงิน addtocart เช่นนี้ในโมดูลใหม่:

app / รหัส / ท้องถิ่น / ชื่อ / ชำระเงิน / ควบคุม / 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 / รหัส / ท้องถิ่น / ชื่อ / ชำระเงิน / 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 / โมดูล / 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 สำหรับ "PAGE CACHE บางครั้งอาจรบกวนสิ่งนี้" นี่เป็นกรณีสำหรับสาเหตุที่ฉันไม่สามารถเพิ่มผลิตภัณฑ์ลงในสิ่งที่อยากได้ เรากำลังใช้การแคชหน้าวานิชและมันกำลังแคชคีย์แบบฟอร์ม
Nick Rolando

1

ไม่สามารถแสดงความคิดเห็นดังนั้นฉันตอบแทน อย่าเพิ่มแบบฟอร์มคีย์ในตัวควบคุม มันปิดการใช้งานประโยชน์ด้านความปลอดภัยของคีย์แบบฟอร์ม หากคุณใช้วานิชคุณสามารถใช้ ESI (Edge Side Include) เพื่อเพิ่มคีย์ได้ คุณจะต้องบันทึกไว้ในคุกกี้เพื่อให้สามารถใช้งานได้


คุณสามารถให้ตัวอย่างว่าจะดูคำสั่ง ESI ของคุณสำหรับ formkey block ได้อย่างไร?
DarkCowboy

คุณควรจะได้รับจากส่วนขยายแคช Phoenix Medie Varnish github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.