原文地址:http://blog.csdn.net/terry_water/article/details/52221007

1.在Yii2配置中配置所有:所有的controller都将关闭csrf验证,如果设置成true,则将打开csrf验证。

'request' => [

  • 'enableCsrfValidation' => false,
  • ],
 

2.在Yii2 controller中配置当前的controller添加变量,下面的设置将关闭csrf验证。

public $enableCsrfValidation = false;

1.在Yii2配置中配置所有:所有的controller都将关闭csrf验证,如果设置成true,则将打开csrf验证。

'request' => [

  • 'enableCsrfValidation' => false,
  • ],
 

2.在Yii2 controller中配置当前的controller添加变量,下面的设置将关闭csrf验证。

public $enableCsrfValidation = false;
 
 
上一节主要是简单地说了一下关于yii2的防御csrf的攻击机制,接下来说一下关于如何全局和局部的开启使用csrf。

(1)全局使用,我们直接在配置文件中设置enableCookieValidation为true

  1. request => [
  2. 'enableCookieValidation' => true,
  3. ]

如果不需要使用csrf的话,设置'enableCookieValidation'
=>
false,但是这是不安全的,因此yii2的yii\web\request中的enableCookieValidation默认设置为true的,也就是默认开启csrf的,所以我们也可以不配置这个值,默认开启。

如果开启csrf,因为这是全局的,所以在任何的post请求都会要求认证,所以我们在post数据的时候,就必须设置csrf的数据隐藏在表单中。

  1. <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)这个方法

  1. public function beforeAction($action) {
  2. $currentaction = $action->id;
  3. $novalidactions = ['dologin'];
  4. if(in_array($currentaction,$novalidactions)) {
  5. $action->controller->enableCsrfValidation = false;
  6. }
  7. parent::beforeAction($action);
  8. return true;
  9. }

传入的参数$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。

 
 
 
 
 

最新文章

  1. Javaweb项目框架搭建-准备篇
  2. UI: 窗口全屏, 窗口尺寸
  3. javascript (js)判断手机号码中国移动、中国联通、中国电信
  4. 从Elo Rating System谈到层次分析法
  5. cocos2dx 3.x(捕鱼达人炮台角度换算)
  6. Unity3D之Legacy动画系统学习笔记
  7. ADO.NET和ORACLE操作数据库传参数赋值的方式
  8. layout布局实例化
  9. 关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别(跳出iframe方法)
  10. Tempo 2.0
  11. laravel定时任务
  12. Scrum Meeting Alpha - 7
  13. CMMI-4中19个PA的大致描述
  14. BZOJ_2068_[Poi2004]SZP_树形DP
  15. 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱
  16. windows cmd命令 批处理bat 导增量jar包【原】
  17. 【依赖注入】Unity和Autofac
  18. robotframework 赋予临时id
  19. HTML 鼠标悬浮隐藏部分 习题
  20. sql server取某个时间段内所有日期或者所有月份

热门文章

  1. python merry -- error handling in the real world
  2. go:interface{}、断言与类型转换
  3. .Net中使用无闪刷新控件时提示框不显示
  4. PHP操作数据库
  5. 教你几种在SQLServer中删除重复数据方法(转)
  6. Swap in C C++ C# Java
  7. Android程序进行混淆,在导出签名apk包时出错!
  8. MySQL - 问题集 - 触发器更新本表数据异常&quot;Can’t update table ‘tbl’ in stored function/trigger because it is already used by statement which invoked this&quot;
  9. JS 之Blob 对象类型
  10. 设置R启动时自动加载常用的包或函数