<input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" />
如果你添加了以上标签还是报错那么你需要坚持看完这篇文档

刚开始做Yii2开发的程序猿基本上都遇到过这个错误,因为在程序设计中避免不了的要向服务器提交数据,那就需要使用到表单。
其实这个错误的提示很明确的其中文错误就是提交的数据验证不通过。我们下来分析导致这个错误的原因。 导致了这个错误的原因是Yii2框架本身的安全机制需要在提交表单时验证CSRF,为了防止CSRF攻击,这对于数据的安全性和防止表单的重复提交时很好也是很简单的一种解决方案。

下边是常规的解决方案:

1.在form标签中添加<input type="hidden" name="_csrf" value="<?=Yii::$app->request->csrfToken?>" />

2.在控制器开始部分添加public $enableCsrfValidation = false;

相信第二种方法一定能够解决问题,但是不安全。你关了CSRF后相当于少了一层安全机制。但是使用第一种方法添加了隐藏标签不一定能够成功,这是为什么呢?让我们仔细分析。

一、yii2框架如何获取CSRF进行验证

我们再方法中并没有手动接受CSRF的值进行验证,那么这一部分是由框架自己来完成的,框架自己来完成就会面临一个问题。你在回传CSRF时对于这个值保存在什么变量中就需要有个统一的约定,不然你传入的是name="_csrf"但是框架接收时是$_POST['csrf-token'](举例而已)那么框架永远接收不到你的值也就没有办法验证通过。

而这一部分是由yii2中的request来完成的。

二、如何约定CSRF的变量名

我们知道CSRF验证是由request组件来完成的,而且我们知道yii2的组件都是可以单独配置的,那么我们打开配置文件。

'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],

在配置文件中如果有request的配置那么我们就可以配置CSRF的变量名了例如在我的程序中配置的变量名是_csrf-frontend那么在添加form隐藏标签时就需要和这儿的配置一致

三、如何解决

打开APP中的配置文件查看request配置中的'csrfParam' => '_csrf-frontend',在视图中的隐藏input的name应该和csrfParam设置的值相同。

如果csrfParam设置的值为_csrf_frontend那么你的input隐藏标签需要这样写:

<input name="_csrf-frontend" type="hidden" value="<?= Yii::$app->request->csrfToken ?>"/>

最新文章

  1. libevent源码分析:time-test例子
  2. SQL 用户定义表类型,在存储过程里使用表类型,表参数作参数
  3. 59.Android开源项目及库 (转)
  4. 解决iOS8安装企业版无反应问题
  5. 最大后验估计 -- Maximum-a-Posteriori (MAP) Estimation
  6. 自定义VS的ItemTemplates 实现任意文件结构
  7. 前端教你学UI——人物处理(一)
  8. 使用jdbc调用存储,函数
  9. JAVA 调用 R 语言之升华篇
  10. Windows 快捷键总结
  11. winrar目录穿越漏洞
  12. FPM五:拆解前面的四——OVP做查询和结果
  13. [C++]PAT乙级1004. 成绩排名 (20/20)
  14. SQL Server 事件探查器和数据库引擎优化顾问
  15. shell中颜色的设置
  16. Zabbix检测Mysql数据库的主从同步
  17. 第二章 ConcurrentHashMap源码解析
  18. HDUOJ-------2844Coins
  19. C++ C# VC VC.net以及VC++有什么区别和联系?
  20. 【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps

热门文章

  1. keystone组件
  2. ZROI2018提高day3t3
  3. jquery 使用记录
  4. CSS相关知识和经验的碎片化记录
  5. Android的性能优化
  6. Dojo Javascript 编程规范(转)
  7. SQL Server之XML PATH()
  8. 等和的分隔子集(DP)
  9. MongoDB初识篇
  10. Bit(位) and Byte(字节) ASCll 编码【基础】