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 中使用随机数的三个步骤
Oct 09 PHP
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
Dec 29 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 PHP
PHP 裁剪图片
Mar 09 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
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
详解Python中的__new__()方法的使用
2015/04/09 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
python 实现兔子生兔子示例
2019/11/21 Python
如何把python项目部署到linux服务器
2020/08/26 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
师范应届生语文教师求职信
2013/10/29 职场文书
团员个人的自我评价
2013/12/02 职场文书
品质主管岗位职责
2014/03/16 职场文书
文明家庭事迹材料
2014/12/20 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
英文辞职信范文
2015/05/13 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
简单聊聊Golang中defer预计算参数
2022/03/25 Golang