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 相关文章推荐
使用PHP和XSL stylesheets转换XML文档
Oct 09 PHP
linux iconv方法的使用
Oct 01 PHP
基于php中使用excel的简单介绍
Aug 02 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
php调用google接口生成二维码示例
Apr 28 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
Laravel框架下的Contracts契约详解
Mar 17 PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 PHP
PHP dirname功能及原理实例解析
Oct 28 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
php源码的安装方法和实例
2019/09/26 PHP
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
python开发简易版在线音乐播放器
2017/03/03 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
酒店办公室文员岗位职责
2013/12/18 职场文书
护士实习鉴定范文
2013/12/22 职场文书
爱护花草树木的标语
2014/06/11 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
青年文明号汇报材料
2014/12/23 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL