ag旗舰厅官网_ag旗舰厅下载客户端

热门关键词: ag旗舰厅官网,ag旗舰厅下载客户端

关于计算机

当前位置:ag旗舰厅官网 > 关于计算机 > x局部禁用csrf验证的例子,关闭和打开csrf

x局部禁用csrf验证的例子,关闭和打开csrf

来源:http://www.pedaLyourcycLe.com 作者:ag旗舰厅官网 时间:2019-09-30 16:18

先是分析下原因:

原作地址:

 

 

当您在布局文件中开采csrf:

1.在Yii2配置中配备全部:全体的controller都将闭馆csrf验证,假如设置成true,则将开采csrf验证。

'request'=>array(
   'enableCsrfValidation'=>true,
),
全局都会对post须求作csrf验证,那么当自家付出对外接口时该如何做?微信、和讯什么的可不会同盟你的csrf机制,唯一的主意正是只对那几个接口央求关闭csrf,但不影响其余专门的学问。

'request' => [

 

  • 'enableCsrfValidation' => false,
  • ],

先行的主见是,在有些地点通过更动 enableCsrfValidation 的值来关闭csrf验证,譬喻一开头作者是如此尝试的:

 

 

 

在调整器的beforeAction或init方法中加上一句代码:

2.在Yii2 controller中安顿当前的controller增加变量,上面包车型客车装置将关门csrf验证。

Yii::app()->request->enableCsrfValidation = false;
战败了,战败了,战败了!首要的事说一回。

public $enableCsrfValidation = false;

 

 

那尼玛该咋办?不能够只可以浪费时间去看框架源码,结果开采它在CHttpRequest中是如此管理的:

 

if($this->enableCsrfValidation)
   Mod::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));

1.在Yii2配置中配备全体:全体的controller都将关门csrf验证,要是设置成true,则将张开csrf验证。

那尼玛,直接放到 Application 的 onBeginRequest 事件中去了,因为爆发在控制器加载在此之前,调整器中做吗都不行!

'request' => [

 

  • 'enableCsrfValidation' => false,
  • ],

ok,想办法:

 

新建二个MyApplication类承继CWebApplication,天公地道写onBeginRequest类,通过一些判定绕过validateCsrfToken动作。

 

很醒目方案1太勤奋,那不好的事件机制自己平昔不想动它,于是小编利用了下边包车型地铁点子。

2.在Yii2 controller中配备当前的controller增添变量,上面包车型地铁设置将闭馆csrf验证。

 

public $enableCsrfValidation = false;

 

 

自家的不二诀窍:

 

 

上一节器重是简简单单地说了一下关于yii2的防止csrf的攻击机制,接下去说一下有关什么全局和某个的拉开使用csrf。
(1)全局使用,大家一贯在安顿文件中设置enableCookieValidation为true

首先,配置文件中关闭csrf

[php] view plain copy print?图片 1图片 2

'request'=>array(
   'enableCsrfValidation'=>false,//强制关闭,不然影响接口服务,转为调节器中手动验证。
),
然后,打开 components/Controller.php,这样写:

  1. request => [  
  2.     'enableCookieValidation' => true,  
  3. ]  

class Controller extends CController
{

若果没有要求运用csrf的话,设置'enableCookieValidation' => false,可是那是不安全的,由此yii2的yiiwebrequest中的enable库克ieValidation暗中认可设置为true的,也正是暗中同意开启csrf的,所以大家也能够不配备那几个值,暗许开启。

   public $enableCS大切诺基F=true;//是不是张开csrf验证

举例展开csrf,因为那是大局的,所以在任何的post诉求都会供给验证,所以我们在post数据的时候,就务须设置csrf的数码隐蔽在表单中。

   //实施action前的拍卖
   public function beforeAction($action)
   {
      $this->validateCsrfToken();
      return parent::beforeAction($action);
   }

[php] view plain copy print?图片 3图片 4

   //验证csrf
   protected function validateCsrfToken()
   {
      if ($this->enableCSRF == true) {
         Mod::app()->request->enableCsrfValidation = true;//属性改为true,以便CHtml::beginForm()生成csrf_token

  1. <input type="hidden" name="_csrf" id='csrf' value="<?= Yii::$app->request->csrfToken ?>">  

         try{
            Mod::app()->request->validateCsrfToken(null);//验证csrf
         } catch(Exception $e) {
            Mod::app()->handleException($e);
         }
      }
   }
}

post数据的时候要求求把那些值post过去,那些值的爆发<?= Yii::$app->request->csrfToken ?>,重临二个加密后的csrfToken。

最首若是通过调整器基类的 beforeAction 来拦截央浼,通过标准推断来手动调用csrf验证。如若有个别调整器不想csrf验证,那么在子调控器中安装

因此随便post表单照旧ajax的post过去,都不能够不设置csrfToken那一个值,並且要付出时要post过去。若无的话,就会发出错误,不可能表达通过。

public $enableCSRF = false;
就能够关闭校验。

(2)假设想在有个别调整器不想采纳csrf验证的话,又该怎么办吗?
方法很轻便,直接设置

public $enableCsrfValidation = false ,

因为那几个Controller继承与yiiwebController ,将相当于继续于enableCsrfValidation那本性格,那么在成立调整器实例时,就能够在这几个调控器关闭csrf功效,访谈那一个调节器的post的方法时,也就不会实行验证。
举二个例子,举个例子大家开辟API的时候,微信那边的接口供给post数据给大家的接口时,由于微信端不领悟csrfToken,所以访谈post数据的时候,若是展开全局csrf的话,那自然不能够访问成功的。所以那时就须要关闭那些API 的csrf。

3)固然要切实关闭至某三个action呢?
突发性在一些效果与利益中,我们须求在某一个action中关闭csrf验证。大家知道对于csrf的证实是在beforeAction($Action)中贯彻的,下边我们可以在Controller中重写beforeAction($action)这么些点子

[php] view plain copy print?图片 5图片 6

  1. public function beforeAction($action) {  
  2.   
  3.     $currentaction = $action->id;  
  4.   
  5.     $novalidactions = ['dologin'];  
  6.   
  7.     if(in_array($currentaction,$novalidactions)) {  
  8.   
  9.         $action->controller->enableCsrfValidation = false;  
  10.     }  
  11.     parent::beforeAction($action);  
  12.   
  13.     return true;  
  14. }  

传扬的参数$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。

 

 

 

 

 

本文由ag旗舰厅官网发布于关于计算机,转载请注明出处:x局部禁用csrf验证的例子,关闭和打开csrf

关键词: