【问题标题】:Disable CSRF validation for individual actions in Yii2禁用 Yii2 中单个操作的 CSRF 验证
【发布时间】:2015-04-16 02:31:00
【问题描述】:

有没有办法为控制器的某些操作禁用 CSRF 验证,同时为其他操作启用它?

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

【问题讨论】:

    标签: csrf yii2


    【解决方案1】:

    对于特定的控制器/操作,您可以像这样禁用 CSRF 验证:

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

    或者在控制器内部:

    $this->enableCsrfValidation = false;
    

    看看yii\web\Controller$enableCsrfValidation属性。

    更新:

    这是一些规范。

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

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

    官方文档:

    【讨论】:

    • 这个参数的检查是在beforeAction中处理的,所以在action里面做这个是没用的。
    • @yujin1st 我实际上并没有提到具体放置它的位置,但是是的,它需要放在beforeAction 中。感谢您的评论,更新了答案。
    • 但是我使用了你的代码,就像你用操作替换它一样
    • $action应该已经包含了action id,在方法里面试试var_dump,结果如何?
    • @Alex 感谢您的评论,更正了答案。顺便说一句,你也可以建议编辑。
    【解决方案2】:

    把它放在你的控制器中,只需用你想禁用csrf的任何操作替换索引。

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

    【讨论】:

    • 为什么在控制器中使用长路由Yii::$app->controller-> 使用$this 来禁用当前控制器操作..
    【解决方案3】:

    对我来说这是有效的

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

    【讨论】:

    • 需要使用 "==" no "="
    【解决方案4】:

    我试过了,效果很好。

    转到特定的控制器并在顶部写下这个。

    public $enableCsrfValidation = false;
    

    【讨论】:

    • 这会禁用控制器中所有操作的 CSRF 验证。 OP 询问个人行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2015-03-18
    • 2018-04-04
    • 2013-05-03
    相关资源
    最近更新 更多