禁用Yii2中各个操作的CSRF验证

cod*_*lex 40 csrf yii2

有没有办法禁用控制器的某些操作的CSRF验证,以保持其他操作的启用?

在我的例子中,我有几个可配置的Action类,用于注入控制器.我无法将csrf验证令牌传递给AJAX请求,因为我正在使用的东西是外部(由我不做)前端的WYSIWYG插件.是的,我仍然可以使用这些操作禁用整个控制器的csrf验证,但它可能不安全.

aro*_*hev 83

对于特定的控制器/操作,您可以禁用CSRF验证,如下所示:

use Yii;

...

Yii::$app->controller->enableCsrfValidation = false;
Run Code Online (Sandbox Code Playgroud)

或者在控制器内部:

$this->enableCsrfValidation = false;
Run Code Online (Sandbox Code Playgroud)

看一下yii \ web\Controller的$ enableCsrfValidation属性.

更新:

这是一些规范.

如果要为单个操作禁用CSRF验证,则需要在beforeAction事件处理程序中执行此操作,因为在操作运行(in beforeActionof yii\web\Controller)之前会检查CSRF令牌.

/**
 * @inheritdoc
 */
public function beforeAction($action)
{            
    if ($action->id == 'my-method') {
        $this->enableCsrfValidation = false;
    }

    return parent::beforeAction($action);
}
Run Code Online (Sandbox Code Playgroud)

官方文档:

  • 检查此参数是在beforeAction中处理,因此在操作内部执行此操作将毫无用处. (2认同)

San*_*rez 6

对我来说这是有效的

public function beforeAction($action) {
    if($action->id == 'my-action') {
        Yii::$app->request->enableCsrfValidation = false;
    }
    return parent::beforeAction($action);
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*air 5

将其放入控制器中,只需将index替换为要禁用的任何操作即可csrf

public function beforeAction()
{      
    if ($this->action->id == 'index') {
        $this->enableCsrfValidation = false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)