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中的integer类型使用分析
Jul 27 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
PHP遍历二维数组的代码
Apr 22 PHP
解析argc argv在php中的应用
Jun 24 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
php实现仿写CodeIgniter的购物车类
Jul 29 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
谈谈PHP语法(2)
2006/10/09 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
js常见表单应用技巧
2008/01/09 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
用python绘制樱花树
2020/10/09 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
幸福家庭事迹材料
2014/02/03 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
一份文言文检讨书
2014/09/13 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
公司人事任命通知
2015/04/20 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers