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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
ThinkPHP标签制作教程
Jul 10 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
利用php输出不同的心形图案
Apr 22 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
php 解析非标准json、非规范json
Apr 01 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 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
Python实现模拟时钟代码推荐
2015/11/08 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
python Tkinter版学生管理系统
2019/02/20 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
学python最电脑配置有要求么
2020/07/05 Python
Python3读写ini配置文件的示例
2020/11/06 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
采购类个人求职的自我评价
2014/02/18 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
通知函格式范文
2015/04/27 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL