Magento 2-formkey的用途是什么


12

我在登录表单中看到了这一行代码。 <?php echo $block->getBlockHtml('formkey'); ?>

  • 有什么用?
  • 它更安全吗?
  • 表格发布必须吗?

Answers:


23

简而言之,Magento中的表单密钥是防止跨站点请求伪造的一种方法,它是为了保护您免受试图从其他冒充您的站点发布到表单(例如添加到购物车)的人的伤害。

这很危险,因为理论上有人可以创建自己的表单并将其发布到商店中的任何表单处理程序控制器操作中。CSRF保护实质上会忽略任何未通过表单发布检查包含的form_key参数的发布。

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

它告诉Magento查找名称为“ formkey”的布局块并将其输出。在Magento中,通常是其中包含以下内容的一些文件:

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

这指示Magento为用户会话输出并存储唯一的表单密钥。在做任何有价值的事情之前,所有受CSRF保护的Magento控制器动作都将对此进行验证。


1
`<?php echo Mage :: getSingleton('core / session')-> getFormKey()?>这将自动生成表单密钥吗?我只需要在表单中回显formkey,Magento会注意所有检查?
保罗

是的magento会保重
Arjun

表单密钥不匹配时可能出现什么情况?客户会话何时到期?当然,我的意思是跨站点请求伪造情况。
Bartosz Kubicki

1
@Arjun在上面的评论中写道,Magento将负责检查formKey。这仅适用于内置控制器。如果您要创建自己的控制器,或者它是不希望使用表单键的第三方控制器,那么就不正确。在这种情况下,您需要自己使用进行检查\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您应该这样声明免责声明,新开发人员将不知道这一点,因此将在phtml中进行设置,并且从问题中的代码示例来看,它似乎需要在phtml中使用
Vlad Patru

1
永远不要使用ObjectManager!
大安范登伯格

1
@jafarpinjar是的,它是一个编码标准,它违背了依赖注入的目的,检查此线程的详细信息:magento.stackexchange.com/questions/117098/...
王子帕特尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.