gpt4 book ai didi

yii2局部关闭(开启)csrf的验证的实例代码

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章yii2局部关闭(开启)csrf的验证的实例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

上一节主要是简单地说了一下关于yii2的防御csrf的攻击机制,接下来说一下关于如何全局和局部的开启使用csrf.

(1)全局使用,我们直接在配置文件中设置enableCookieValidation为true 。

?
1
2
3
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验证的话,又该如何做呢?

方法很简单,直接设置 。

?
1
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)这个方法 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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功能,所以就将这个控制器实例的设置为 。

?
1
$action ->controller->enableCsrfValidation = false

接下来再执行parent::beforeAction($action),此时传入来的$action里的controller实例的enableCsrfValidation已变为false.

最后一定要返回true,否则的话,不会往下执行action操作的.

(4)如果局部开启呢?

首先在配置文件要设置 。

?
1
2
3
request => [
'enableCookieValidation' => false,
]

全局不使用csrf.

(a)要在控制器中开启,只需要设置 。

?
1
public $enableCsrfValidation = true

则整个控制器都会开启 。

(b)要在action中开启 。

?
1
2
3
4
5
6
7
8
9
10
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.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://blog.csdn.net/u012979009/article/details/51791810 。

最后此篇关于yii2局部关闭(开启)csrf的验证的实例代码的文章就讲到这里了,如果你想了解更多关于yii2局部关闭(开启)csrf的验证的实例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com