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 ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
php设计模式 Visitor 访问者模式
Jun 28 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
深入分析PHP引用(&amp;)
Sep 04 PHP
php中in_array函数用法分析
Nov 15 PHP
php实现仿写CodeIgniter的购物车类
Jul 29 PHP
php实现微信扫码支付
Mar 26 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
laravel自定义分页效果
Jul 23 PHP
PHP-FPM和Nginx的通信机制详解
Feb 01 PHP
php的单例模式及应用场景详解
Feb 27 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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
Jquery实现简单的动画效果代码
2012/03/18 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
[06:36]吞吞映像top1
2014/06/20 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
详解用python实现简单的遗传算法
2018/01/02 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
英语专业求职信
2014/07/08 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
同事去世追悼词
2015/06/23 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
PyTorch中的torch.cat简单介绍
2022/03/17 Python