ฉันเห็นบรรทัดของรหัสนี้ในแบบฟอร์มการเข้าสู่ระบบ
<?php echo $block->getBlockHtml('formkey'); ?>
- การใช้งานมันคืออะไร?
- ปลอดภัยกว่าไหม?
- มันเป็นสิ่งจำเป็นสำหรับการโพสต์แบบฟอร์ม?
ฉันเห็นบรรทัดของรหัสนี้ในแบบฟอร์มการเข้าสู่ระบบ
<?php echo $block->getBlockHtml('formkey'); ?>
คำตอบ:
ปุ่มแบบฟอร์มในวีโอไอพีเป็นวิธีการป้องกันการปลอมแปลงคำขอข้ามไซต์โดยย่อก็เพื่อให้คุณปลอดภัยจากผู้ที่พยายามโพสต์ในแบบฟอร์มของคุณ (เช่นสั่งซื้อ) จากไซต์อื่น ๆ ที่วางตัวคุณ
สิ่งนี้อาจเป็นอันตรายได้เพราะบางคนในทางทฤษฎีสามารถสร้างรูปแบบของตนเองและโพสต์ไปยังแอ็คชั่นตัวจัดการรูปแบบใดก็ได้ในร้านค้าของคุณ การป้องกัน CSRF จะไม่สนใจการโพสต์ใด ๆ ที่ไม่ผ่านการตรวจสอบพารามิเตอร์ form_key ที่รวมอยู่กับการโพสต์แบบฟอร์ม
<?php echo $this->getBlockHtml('formkey')?>
มันบอกให้วีโอไอพีค้นหาบล็อกเลย์เอาต์ที่มีชื่อ "formkey" และเอาท์พุทมัน ใน Magento ไฟล์นี้มักจะมีอยู่ในนั้น
<div><input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /></div>
สิ่งนี้สั่งให้วีโอไอพีส่งออกและเก็บคีย์ฟอร์มที่ไม่ซ้ำกันสำหรับเซสชันผู้ใช้ การกระทำของวีโอไอพีที่ได้รับการคุ้มครองโดย CSRF ทั้งหมดจะตรวจสอบสิ่งนี้ก่อนทำสิ่งใด ๆ ที่มีค่า
\Magento\Framework\Data\Form\FormKey\Validator
ในกรณีนี้คุณจะต้องตรวจสอบตัวเองโดยใช้
คุณสามารถเพิ่ม formkey ด้วยรหัสนี้:
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$FormKey = $objectManager->get('Magento\Framework\Data\Form\FormKey');
?>
//Hidden form key field after <form> tag
<input name="form_key" type="hidden" value="<?php echo $FormKey->getFormKey();?>">
หากคุณต้องการเพิ่มแบบฟอร์มคีย์ในไฟล์ phtml ให้ใช้โดยตรง
$ this-> getFormKey ()
<input name="form_key" type="hidden" value="<?php echo $block->getFormKey();?>">
ใช้การฉีดพึ่งพาในตัวสร้างคลาสของคุณ:
protected $formKey;
public function __construct(
\Magento\Framework\Data\Form\FormKey $formKey
) {
$this->formKey = $formKey;
}
public function getFormKey()
{
return $this->formKey->getFormKey();
}
หมายเหตุ: อย่าใช้ตัวจัดการวัตถุโดยตรงในไฟล์ phtml
ObjectManager
ใช้ในส่วนหน้านี่ไม่ใช่วิธีปฏิบัติที่ดี
ไม่จำเป็นต้องเริ่มต้นตัวจัดการวัตถุและคุณสามารถใช้
window.FORM_KEY
ส่วนหน้าคุณสามารถใช้:
$block->getKey()
หวังว่านี่จะช่วยได้!
ขอบคุณ