Yii2 关闭和打开csrf 验证

CSRF即Cross-site request forgery跨站请求伪造,是指有人冒充你的身份进行一些恶意操作。
比如你登录了网站A,网站A在你的电脑设置了cookie用以标识身份和状态,然后你又访问了网站B,这时候网站B就可以冒充你的身份在A网站进行操作,因为网站B在请求网站A时,浏览器会自动发送之前设置的cookie信息,让网站A误认为仍然是你在进行操作。
对于csrf的防范,一般都会放在服务器端进行,那么我们来看下Yii2中是如何进行防范的。

关于CSRF验证

  • 全局关闭(不安全),所有的controller都将关闭csrf验证,如果设置成true,则将打开csrf验证。
//configmain.php
request => [
    'enableCookieValidation' => false,
]
  • 控制器内关闭CSRF
public enableCsrfValidation = false ,
  • 关闭至某一个action的CSRF
public function beforeAction($action) {
  
    $currentaction = $action->id;
  
    $novalidactions = ['dologin'];
  
    if(in_array($currentaction,$novalidactions)) {
  
        $action->controller->enableCsrfValidation = false;
    }
    parent::beforeAction($action);
  
    return true;
}
  • 开启某些action的CSRF
    public $enableCsrfValidation = false;
    //仅对用户新增、编辑['signup','update'],开启CSRF认证 
    public function beforeAction($action)
    {
        $currentaction = $action->id;
        $accessactions = ['signup','update'];
        if (in_array($currentaction, $accessactions)) {
            $action->controller->enableCsrfValidation = true;
        }
        parent::beforeAction($action);
        return true;
    }
  • 普通提交,form表单中加入隐藏域
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
<input name="<?= Yii::$app->request->csrfParam; ?>" type="hidden" value="<?= Yii::$app->request->csrfToken ?>">
  • ajax异步提交,加入_csrf字段
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
  type: 'POST',
  url: url,
  data: {_csrf:csrfToken},
  success: success,
  dataType: dataType
});

参考:
https://www.cnblogs.com/Yanger90/p/5799739.html
https://www.cnblogs.com/niuben/p/11057454.html
https://blog.csdn.net/terry_water/article/details/52221007

原文地址:https://www.cnblogs.com/meetuj/p/14247748.html