zoukankan      html  css  js  c++  java
  • yii2框架-yii2局部关闭(开启)csrf的验证

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

    [php] view plain copy
     
    1. request => [  
    2.     'enableCookieValidation' => true,  
    3. ]  

    如果不需要使用csrf的话,设置'enableCookieValidation' => false,但是这是不安全的,因此yii2的yiiweb equest中的enableCookieValidation默认设置为true的,也就是默认开启csrf的,所以我们也可以不配置这个值,默认开启。

    如果开启csrf,因为这是全局的,所以在任何的post请求都会要求认证,所以我们在post数据的时候,就必须设置csrf的数据隐藏在表单中。

    [php] view plain copy
     
    1. <input name="_csrf-backend" type="hidden" id="_csrf" value="<?php echo Yii::$app->request->csrfToken ?>">(每个人定论的csrf的name属性不一样,请自己参考自己的项目)

    post数据的时候必须要把这个值post过去,这个值的产生<?= Yii::$app->request->csrfToken ?>,返回一个加密后的csrfToken。

    所以无论是post表单还是ajax的post过去,都必须设置csrfToken这个值,并且要提交时要post过去。如果没有的话,就会发生错误,无法认证通过。

    (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
     
    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。

  • 相关阅读:
    ORB随便记一记
    POJ 树的直径和重心
    LeetCode 834. Sum of Distances in Tree
    LeetCode 214. Shortest Palindrome
    DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。
    坐标变换
    论文阅读:hector_slam: A Flexible and Scalable SLAM System with Full 3D Motion Estimation.
    POJ 尺取法
    POJ 博弈论
    oracle锁表
  • 原文地址:https://www.cnblogs.com/wenxinphp/p/8617106.html
Copyright © 2011-2022 走看看