ฉันมีหน้าเว็บที่ฉันแสดงผลิตภัณฑ์ไว้ ชนิดของcatalog/view.phtml
โคลน รวมอยู่app/Mage.php
ด้วย
ในหน้านี้ฉันใช้
Mage::getSingleton('core/session')->getFormKey();
แต่มันแตกต่างจากรูปแบบอื่นของคีย์
ผมทำอะไรผิดหรือเปล่า?
ฉันมีหน้าเว็บที่ฉันแสดงผลิตภัณฑ์ไว้ ชนิดของcatalog/view.phtml
โคลน รวมอยู่app/Mage.php
ด้วย
ในหน้านี้ฉันใช้
Mage::getSingleton('core/session')->getFormKey();
แต่มันแตกต่างจากรูปแบบอื่นของคีย์
ผมทำอะไรผิดหรือเปล่า?
คำตอบ:
น่าจะเป็นอะไรที่สำคัญเพราะรูปแบบเป็นแบบสุ่มดังนั้นจึงมีจะแตกต่างกันในแต่ละครั้ง
ดังนั้นจึงไม่ควรสร้างความแตกต่าง แต่วิธีปฏิบัติที่ดีที่สุดวิธีที่คุณควรเพิ่มการป้อนคีย์แบบฟอร์มให้กับแม่แบบของคุณคือ:
<?php echo $this->getBlockHtml('formkey') ?>
อัปเดต:ฉันต้องยอมรับว่าฉันผิดในจุดเดียว: คีย์ฟอร์มยังคงเหมือนเดิมในระหว่างเซสชัน หากคุณมีคีย์ฟอร์มที่แตกต่างกันในหน้าเว็บที่ต่างกันนี่อาจเป็นปัญหากับแคชหน้าเต็มของบุคคลที่สามที่มีคีย์ฟอร์มในแคช (ซึ่งไม่ควรใช้) หรือคีย์ฟอร์มอยู่ในบล็อกที่กำหนดเองซึ่งใช้บล็อก ขุมทรัพย์ ในตอนหลังฉันพบวิธีแก้ไข: บล็อกแคชที่มี form_key (เช่นเนื้อหาแบบไดนามิก)
getBlockHtml()
มีการใช้งานในMage_Core_Block_Abstract
และformkey
บล็อกดังกล่าวได้รับการกำหนดในbase/default/layout/core.xml
<input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>
ดูเหมือนจะแก้ไขได้ แต่ก็ยังน่าผิดหวัง มีวิธีที่ดีกว่า.
ฉันรู้ว่าคำถามที่คลุมเครือนี้ไม่ควรตอบ อย่างไรก็ตามฉันอาจพบปัญหาที่คล้ายกันที่นี่นี่คือสิ่งที่ฉันได้เรียนรู้:
จากตัวอย่างสั้น ๆฉันจึงได้แทนที่การดำเนินการชำระเงิน 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>
ฉันหวังว่านี่จะเพียงพอสำหรับทุกคนที่จะสร้างสิ่งนี้
ไม่สามารถแสดงความคิดเห็นดังนั้นฉันตอบแทน อย่าเพิ่มแบบฟอร์มคีย์ในตัวควบคุม มันปิดการใช้งานประโยชน์ด้านความปลอดภัยของคีย์แบบฟอร์ม หากคุณใช้วานิชคุณสามารถใช้ ESI (Edge Side Include) เพื่อเพิ่มคีย์ได้ คุณจะต้องบันทึกไว้ในคุกกี้เพื่อให้สามารถใช้งานได้