yii2框架-yii2局部关闭(开启)csrf的验证(十七)
来源:互联网 发布:nginx request body 编辑:程序博客网 时间:2024/06/02 20:38
(1)全局使用,我们直接在配置文件中设置enableCookieValidation为true
request => ['enableCookieValidation' => true,]如果不需要使用csrf的话,设置'enableCookieValidation' => false,但是这是不安全的,因此yii2的yii\web\request中的enableCookieValidation默认设置为true的,也就是默认开启csrf的,所以我们也可以不配置这个值,默认开启。
如果开启csrf,因为这是全局的,所以在任何的post请求都会要求认证,所以我们在post数据的时候,就必须设置csrf的数据隐藏在表单中。
<input type="hidden" name="_csrf" id='csrf' value="<?= Yii::$app->request->csrfToken ?>">post数据的时候必须要把这个值post过去,这个值的产生<?= Yii::$app->request->csrfToken ?>,返回一个加密后的csrfToken。
所以无论是post表单还是ajax的post过去,都必须设置csrfToken这个值,并且要提交时要post过去。如果没有的话,就会发生错误,无法认证通过。
(2)如果想在某些控制器不想使用csrf验证的话,又该如何做呢?
方法很简单,直接设置
public $enableCsrfValidation = false ,
因为这个Controller继承与yii\web\Controller ,将相当于继承于enableCsrfValidation这个属性,那么在创建控制器实例时,就会在这个控制器关闭csrf功能,访问这个控制器的post的方式时,也就不会进行验证。
举一个例子,比如我们开发API的时候,微信那边的接口需要post数据给我们的接口时,由于微信端不知道csrfToken,所以访问post数据的时候,如果开启全局csrf的话,那肯定不能访问成功的。所以这时就需要关闭这个API 的csrf。
3)如果要具体关闭至某一个action呢?
有时在一些功能中,我们需要在某一个action中关闭csrf验证。我们知道对于csrf的验证是在beforeAction($Action)中实现的,下面我们可以在Controller中重写beforeAction($action)这个方法
public function beforeAction($action) {$currentaction = $action->id;$novalidactions = ['dologin'];if(in_array($currentaction,$novalidactions)) { $action->controller->enableCsrfValidation = false; }parent::beforeAction($action);return true;}传入的参数$action是controller针对这个访问实例化的对象,里面包含很多信息,大家可以打印看看。
首先执行$action->id获取当前的访问的action名称。而$novalidactions是一个数组,里面是action名称,这些action都是是你需要关闭csrf的认证的操作(需要关闭csrf认证的操作)。
通过当前的访问的action是否在这个$novalidactions中,如果在,说明这个action需要关闭csrf功能,所以就将这个控制器实例的设置为
$action->controller->enableCsrfValidation = false
接下来再执行parent::beforeAction($action),此时传入来的$action里的controller实例的enableCsrfValidation已变为false。
最后一定要返回true,否则的话,不会往下执行action操作的。
(4)如果局部开启呢?
首先在配置文件要设置
request => [
'enableCookieValidation' => false,
]
全局不使用csrf。
(a)要在控制器中开启,只需要设置
public $enableCsrfValidation = true
则整个控制器都会开启
(b)要在action中开启
public function beforeAction($action) {
$currentaction = $action->id;
$accessactions = ['dologin'];
i f(in_array($currentaction,$accessactions)) {
$action->controller->enableCsrfValidation = true;
}
parent::beforeAction($action);
return true;
}
$accessactions是需要开启csrf的action的名称,将设置$action->controller->enableCsrfValidation = true,当前操作可以开启csrf。
- yii2框架-yii2局部关闭(开启)csrf的验证(十七)
- Yii2 关闭csrf和布局的关闭开启
- Yii2 关闭和打开csrf 验证
- yii2之CSRF验证
- yii2框架-yii2的rules验证(七)
- yii2.0 局部关闭csrf,让应用的回调可以post
- yii2框架-yii2的防御csrf攻击机制(十六)
- 【Yii2】yii2学习之CSRF验证
- YII2微信开发接收请求失败 关闭指定action的CSRF验证
- yii2学习之CSRF验证
- yii2学习之CSRF验证
- yii2 csrf
- yii2:csrf
- yii2关闭form表单的实时验证
- yii2框架-yii2的核心验证器(八)
- yii2.0的csrf问题
- Yii2的urlmanager开启
- Yii2的urlmanager开启
- android之控件布局的几个小案例
- 机器学习:模型评估和优化
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- Django 发送email配置详解及各种错误类型
- 9-7节点属性
- yii2框架-yii2局部关闭(开启)csrf的验证(十七)
- 使用comm在java程序中管理本地端口
- java 内部类(inner class)详解
- 解决在部分手机webview字体显示过小的问题
- java文件读取web-inf下的spring的xml配置文件
- 相同HID设备的句柄获取
- 【算法设计与分析】墓地雕塑
- c#对两个txt文件的列合并
- 百度 进程调度算法