yii2局部关闭(开启)csrf的验证的实例代码


Posted in PHP onJuly 10, 2017

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

(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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
初识ThinkPHP控制器
Apr 07 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 #PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 #PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 #PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 #PHP
form自动提交实例讲解
Jul 10 #PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 #PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 #PHP
You might like
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
5种Python单例模式的实现方式
2016/01/14 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
《孔子游春》教学反思
2014/02/25 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
经典祝酒词大全
2015/08/12 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python