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