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下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
PHP输入输出流学习笔记
May 12 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
php实现的http请求封装示例
Nov 08 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
php设计模式之工厂模式用法经典实例分析
Sep 20 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
Oct 20 PHP
windows系统php环境安装swoole具体步骤
Mar 04 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
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
js a标签点击事件
2017/03/30 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
Vue页面骨架屏注入方法
2018/05/13 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
Oracle性能调优原则
2012/05/03 面试题
司机岗位职责
2013/11/15 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
中央空调节能方案
2014/06/15 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
化工厂员工工作总结
2015/10/15 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
关于Vue中的options选项
2022/03/22 Vue.js