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

时间:2015-02-15 14:04:24

标签: csrf yii2

是否有办法为控制器的某些操作禁用CSRF验证,以使其为其他操作启用?

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

4 个答案:

答案 0 :(得分:77)

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

use Yii;

...

Yii::$app->controller->enableCsrfValidation = false;

或在控制器内:

$this->enableCsrfValidation = false;

查看$enableCsrfValidationyii\web\Controller属性。

<强>更新

这是一些规范。

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

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

    return parent::beforeAction($action);
}

官方文档:

答案 1 :(得分:4)

将其放入您的控制器中,只需将索引替换为您要禁用csrf的任何操作。

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

答案 2 :(得分:2)

对我而言,这是有效的

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

答案 3 :(得分:2)

我试过这个并且有效。

转到特定控制器并将其写在顶部。

public $enableCsrfValidation = false;