Magento 2 - การใช้ formkey คืออะไร


12

ฉันเห็นบรรทัดของรหัสนี้ในแบบฟอร์มการเข้าสู่ระบบ <?php echo $block->getBlockHtml('formkey'); ?>

  • การใช้งานมันคืออะไร?
  • ปลอดภัยกว่าไหม?
  • มันเป็นสิ่งจำเป็นสำหรับการโพสต์แบบฟอร์ม?

คำตอบ:


23

ปุ่มแบบฟอร์มในวีโอไอพีเป็นวิธีการป้องกันการปลอมแปลงคำขอข้ามไซต์โดยย่อก็เพื่อให้คุณปลอดภัยจากผู้ที่พยายามโพสต์ในแบบฟอร์มของคุณ (เช่นสั่งซื้อ) จากไซต์อื่น ๆ ที่วางตัวคุณ

สิ่งนี้อาจเป็นอันตรายได้เพราะบางคนในทางทฤษฎีสามารถสร้างรูปแบบของตนเองและโพสต์ไปยังแอ็คชั่นตัวจัดการรูปแบบใดก็ได้ในร้านค้าของคุณ การป้องกัน 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 ทั้งหมดจะตรวจสอบสิ่งนี้ก่อนทำสิ่งใด ๆ ที่มีค่า


1
`<? php echo Mage :: getSingleton ('คอร์ / เซสชั่น') -> getFormKey ()?> สิ่งนี้จะสร้างคีย์ฟอร์มโดยอัตโนมัติหรือไม่ ฉันเพียงแค่ต้องสะท้อนรูปแบบในแบบฟอร์มและวีโอไอพีจะดูแลการตรวจสอบทั้งหมดหรือไม่
เปาโล

ใช่คุณภาพเยี่ยมจะดูแล
Arjun

สถานการณ์ที่เป็นไปได้คืออะไรเมื่อแบบฟอร์มคีย์ไม่ตรงกัน เมื่อเซสชันลูกค้าหมดอายุหรืออะไร แน่นอนฉันหมายถึงสถานการณ์นอกเหนือจากการปลอมแปลงคำขอข้ามไซต์
Bartosz Kubicki

1
@Arjun เขียนในความคิดเห็นข้างต้นว่า Magento จะดูแลการตรวจสอบแบบฟอร์มที่สำคัญ สิ่งนี้เป็นจริงสำหรับตัวควบคุมในตัวเท่านั้น หากคุณกำลังสร้างตัวควบคุมของคุณเองหรือถ้ามันเป็นตัวควบคุมบุคคลที่สามที่ไม่คาดหวังว่าจะมีคีย์ฟอร์มแสดงว่าสิ่งนี้ไม่เป็นจริง \Magento\Framework\Data\Form\FormKey\Validatorในกรณีนี้คุณจะต้องตรวจสอบตัวเองโดยใช้
สกอตต์บูคานัน

4
@Arjun คำตอบนี้ทำให้เข้าใจผิด แท็กหมายถึง magento 2 แต่คุณได้ยกตัวอย่างสำหรับ magento 1
theSeeker

21

คุณสามารถเพิ่ม 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


1
โซลูชั่นที่ดี ..
Rakesh Jesadiya

2
หยุดแนะนำให้ObjectManagerใช้ในส่วนหน้านี่ไม่ใช่วิธีปฏิบัติที่ดี
Vlad Patru

1
@PrincePatel คุณ shoud ใส่ข้อจำกัดความรับผิดชอบเช่นนั้นนักพัฒนาใหม่จะไม่ทราบเรื่องนี้และจะตั้งค่าใน phtml และจากตัวอย่างรหัสในคำถามดูเหมือนว่ามันจะต้องมีการใช้ใน PHP
Vlad Patru

1
อย่าใช้ ObjectManager เลย!
Daan van den Bergh

1
@jafarpinjar ใช่มันเป็นมาตรฐานการเขียนโปรแกรมและเอาชนะจุดประสงค์ของการฉีดพึ่งพาตรวจสอบหัวข้อนี้สำหรับข้อมูลเพิ่มเติม: magento.stackexchange.com/questions/117098/…
Patel

-1

ไม่จำเป็นต้องเริ่มต้นตัวจัดการวัตถุและคุณสามารถใช้

window.FORM_KEY

ส่วนหน้าคุณสามารถใช้:

$block->getKey()

หวังว่านี่จะช่วยได้!

ขอบคุณ


2
ใช้ได้เฉพาะในแบ็กเอนด์
Alex Dinca

ไม่แน่ใจเกี่ยวกับเรื่องนี้ แต่ฉันได้อัปเดตคำตอบสำหรับส่วนหน้าด้วย
Kapil Yadav
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.