yii2关闭(开启)csrf的验证

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

 

复制代码
1
2
3
request => [
    'enableCookieValidation' => true,
]

 

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

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

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

 post数据的时候必须要把这个值post过去,这个值的产生<?= Yii::app>request>csrfToken?>csrfTokenpostajaxpostcsrfTokenpost2使csrfpublicenableCsrfValidation = false ,

因为这个Controller继承与yii\web\Controller ,将相当于继承于enableCsrfValidation这个属性,那么在创建控制器实例时,就会在这个控制器关闭csrf功能,访问这个控制器的post的方式时,也就不会进行验证。
举一个例子,比如我们开发API的时候,微信那边的接口需要post数据给我们的接口时,由于微信端不知道csrfToken,所以访问post数据的时候,如果开启全局csrf的话,那肯定不能访问成功的。所以这时就需要关闭这个API 的csrf。

3)如果要具体关闭至某一个action呢?
有时在一些功能中,我们需要在某一个action中关闭csrf验证。我们知道对于csrf的验证是在beforeAction(Action)ControllerbeforeAction(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;
}

 传入的参数actioncontroller访action->id获取当前的访问的action名称。而novalidactionsactionactioncsrfcsrf访actionnovalidactions中,如果在,说明这个action需要关闭csrf功能,所以就将这个控制器实例的设置为

action>controller>enableCsrfValidation=falseparent::beforeAction(action),此时传入来的actioncontrollerenableCsrfValidationfalsetrueaction4request=>[enableCookieValidation=>false,]使csrf(a)publicenableCsrfValidation = true
则整个控制器都会开启

(b)要在action中开启
public function beforeAction(action)$currentaction=$action>id;$accessactions=[dologin];if(inarray($currentaction,$accessactions))$action>controller>enableCsrfValidation=true;parent::beforeAction($action);returntrue;accessactions是需要开启csrf的action的名称,将设置$action->controller->enableCsrfValidation = true,当前操作可以开启csrf。
(5)在AJAX中加入_csrf字段

复制代码
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
  type: 'POST',
  url: url,
  data: {_csrf:csrfToken},
  success: success,
  dataType: dataType
});

 

posted @   牛奔  阅读(1914)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示