Magento 2 - Việc sử dụng formkey là gì


12

Tôi thấy dòng mã này trong mẫu đăng nhập. <?php echo $block->getBlockHtml('formkey'); ?>

  • Công dụng của nó là gì?
  • Có an toàn hơn không?
  • Đây có phải là một bài viết bắt buộc không?

Câu trả lời:


23

Khóa biểu mẫu trong Magento là một biện pháp ngăn chặn giả mạo yêu cầu trang web chéo , nói tóm lại, nó giúp bạn an toàn trước những người cố gắng đăng lên biểu mẫu của bạn (như thêm vào giỏ hàng) từ các trang web khác đặt ra như bạn.

Điều này có thể nguy hiểm vì về mặt lý thuyết ai đó có thể tạo biểu mẫu của riêng họ và đăng lên bất kỳ hành động điều khiển trình xử lý biểu mẫu nào trong cửa hàng của bạn. Bảo vệ CSRF về cơ bản bỏ qua bất kỳ bài đăng nào không kiểm tra tham số form_key kèm theo với bài đăng mẫu.

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

Nó bảo Magento tìm kiếm một khối bố cục có tên "formkey" và xuất nó. Trong Magento, đây thường là một số tệp có trong đó:

<div><input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /></div>

Điều này hướng dẫn Magento xuất và lưu trữ khóa biểu mẫu duy nhất cho phiên người dùng. Tất cả các hành động của bộ điều khiển Magento được CSRF bảo vệ sẽ xác minh chống lại điều này trước khi làm bất cứ điều gì có giá trị.


1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> điều này sẽ tự động tạo khóa biểu mẫu? Tôi chỉ cần lặp lại formkey trong một hình thức và Magento sẽ chăm sóc tất cả các kiểm tra?
Paul

vâng, magento sẽ chăm sóc
Arjun

tình huống nào có thể xảy ra khi khóa biểu mẫu không khớp? Khi phiên khách hàng hết hạn hay cái gì? Tất nhiên tôi có nghĩa là tình huống ngoài trang web yêu cầu giả mạo.
Bartosz Kubicki

1
@Arjun đã viết trong một bình luận ở trên rằng Magento sẽ chăm sóc việc kiểm tra formKey. Điều này chỉ đúng với bộ điều khiển tích hợp. Nếu bạn đang tạo bộ điều khiển của riêng mình hoặc nếu đó là bộ điều khiển của bên thứ ba không mong đợi khóa biểu mẫu, thì điều này không đúng. Trong những trường hợp này, bạn cần phải tự kiểm tra bằng cách sử dụng \Magento\Framework\Data\Form\FormKey\Validator.
Scott Hội trưởng

4
@Arjun câu trả lời này là sai lệch. thẻ đề cập đến magento 2 nhưng bạn đã đưa ra một ví dụ cho magento 1
theSeeker

20

Bạn có thể thêm formkey bằng mã này:

<?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();?>">

Nếu bạn muốn thêm khóa biểu mẫu trong tệp phtml thì hãy sử dụng trực tiếp

$ this-> getFormKey ()

<input name="form_key" type="hidden" value="<?php echo $block->getFormKey();?>">

Sử dụng Dependency Injection trong lớp xây dựng của bạn:

protected $formKey;

public function __construct(
    \Magento\Framework\Data\Form\FormKey $formKey
) {
    $this->formKey = $formKey;
}

public function getFormKey()
{
     return $this->formKey->getFormKey();
}

Lưu ý: Không sử dụng trình quản lý đối tượng trực tiếp trong tệp phtml


1
giải pháp tốt đẹp ..
Rakesh Jesadiya

2
Ngừng đề xuất ObjectManagersử dụng ở frontend đây không phải là một thực hành tốt.
Vlad Patru

1
@PrincePatel Bạn nên từ chối trách nhiệm như vậy, một nhà phát triển mới sẽ không biết điều này và sẽ đặt trong phtml và từ mẫu mã trong câu hỏi có vẻ như nó cần được sử dụng trong phtml
Vlad Patru

1
Đừng sử dụng ObjectManager bao giờ!
Daan van den Bergh

1
@jafarpinjar Có, đó là một tiêu chuẩn mã hóa và nó đánh bại mục đích của việc tiêm phụ thuộc Kiểm tra chủ đề này để biết thêm thông tin: magento.stackexchange.com/questions/117098/ Khăn
Hoàng tử Patel

-1

Không cần khởi tạo trình quản lý đối tượng và tất cả, bạn có thể sử dụng.

window.FORM_KEY

Frontend bạn có thể sử dụng:

$block->getKey()

Hi vọng điêu nay co ich!

Cảm ơn


2
Điều này chỉ có sẵn trong phần phụ trợ
Alex Dinca

Không chắc chắn về điều đó, nhưng tôi cũng đã cập nhật câu trả lời cho front-end.
Kapil Yadav
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.