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中for循环语句的几种变型
Mar 16 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
Yii调试SQL的常用方法
Jul 09 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
php中return的用法实例分析
Feb 28 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
浅析PHP7的多进程及实例源码
Apr 14 PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 PHP
Laravel-admin之修改操作日志的方法
Sep 30 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
各种战术和打法的原创者
2020/03/04 星际争霸
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
php 浮点数比较方法详解
2017/05/05 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python实现键盘输入的实操方法
2019/07/16 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
统计员岗位职责
2013/11/14 职场文书
差生评语大全
2014/05/04 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
vue递归实现树形组件
2022/07/15 Vue.js