最近在拿 yii 2.0 开发ajax提交,在 post 请求接口时,提示数据无法验证,于是查询 yii 错误日志,发现错误为

exception ‘yiiwebBadRequestHttpException’ with message ‘Unable to verify your data submission

于是查看源代码,yii 2.0 在 我们继承的顶级 controller 中,有下列属性

/**
* @var boolean whether to enable CSRF validation for the actions in this controller.
* CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
*/
public $enableCsrfValidation = true;

106 行的 beforeAction 内,对他做了处理

``` public function beforeAction($action) { if (parent::beforeAction($action)) { if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) { throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.')); } return true; } else { return false; } }

```

于是找到错误原因:

yii 2.0 内,对 CSRF 攻击做了处理,会对 post 提交的数据做 token 验证,而微信 post 到我们服务器的代码中,没有带上这个 token ,所以会验证失败

解决方法:

1、在我们的控制器里面,加上这行属性,设置为 false

public $enableCsrfValidation = false;

你还可以直接修改顶层控制器的 $enableCsrfValidation ,但是不推荐这样做!

2、关于如何在单独的action中关闭Csrf验证

由于Yii2 Controller Csrf验证是在beforeAction中完成的,所以在action中指定
$this->enableCsrfValidation = false;
不能实现局部关闭Csrf。

如何实现

新建一个Behavior

<?php
use Yii;
use yii\base\ActionEvent;
use yii\base\Behavior;
use yii\web\Controller; class NoCsrf extends Behavior
{
public $actions = [];
public $controller;
public function events()
{
return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
}
public function beforeAction($event)
{
$action = $event->action->id;
if(in_array($action, $this->actions)){
$this->controller->enableCsrfValidation = false;
}
}
}

然后在Controller中添加Behavior

?php

    public function behaviors()
{
return [
'csrf' => [
'class' => NoCsrf::className(),
'controller' => $this,
'actions' => [
'action-name'
]
]
];
}

这样就实现了在action中关闭Csrf而不是在整个Controller中关闭。

最新文章

  1. SharePoint 2013 Ajax 造成页面无法编辑
  2. web前端
  3. 总结Spring、Hibernate、Struts2官网下载jar文件
  4. mysql取代rand()的高效率随机读取方法
  5. XML约束——Schema约束
  6. 5.python的字符串
  7. dateTimePicker日期时间插件-----限定节假日调休的可选择性
  8. 正式学习React (六) 项目篇
  9. javascript语言精粹:继承
  10. sap的示例代码
  11. Vold工作流程分析学习
  12. 6. leetcode 136. Single Number
  13. 【BZOJ3531】【SDOI2014】旅行
  14. centos 安装 vsftpd
  15. 转 jQuery中的$.extend方法来扩展JSON对象
  16. 第五节,TensorFlow编程基础案例-session使用(上)
  17. golang 常用包安装
  18. Android Studio启动后出现cannot bind to 127.0.0.1:5037 10048的解决办法
  19. 解决SecureCRT/Xshell无法以root用户连接Ubuntu
  20. Redis系列三:reids常用命令

热门文章

  1. Python 中,matplotlib绘图无法显示中文的问题
  2. iOS masonry布局在iOS11/12上正常 iOS9/10却异常
  3. Elasticsearch5.X IN Windows 10 系列文章(2)
  4. easyUI combox静态动态联动
  5. 第一百七十四节,jQuery,Ajax进阶
  6. 创建动作-Action:
  7. Eclipse 添加书签
  8. 寒城攻略:Listo 教你用Swift 语言编写 IOS 平台流媒体播放器
  9. sqoop-1.4.4安装配置
  10. ASP.NET动态网站制作(26)-- Ajax