Answers:
简而言之,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控制器动作都将对此进行验证。
\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()
希望这可以帮助!
谢谢