【问题标题】:Yii2 Csrf on turned off cookiesYii2 Csrf 关闭 cookie
【发布时间】:2015-06-23 18:03:49
【问题描述】:

我在 Yii2 上的 AJAX 请求的 crsf 验证存在问题。 配置文件中允许使用 Crsf

 'request'=>array(
        'enableCsrfValidation'=>true,
        'enableCookieValidation'=>true,
    ),

我在主应用程序布局中有这一行

<?= Html::csrfMetaTags() ?>

开启cookies后一切正常。 http header 也有一个 X-CSRF-Token,witch 值与 cookie 的 _crsf 参数不同。 当我尝试在本地主机上禁用 cookie(为 nocookie 用户测试网站)时,ajax 请求无法正常工作。 (错误 400 错误请求)。 在 http 请求标头中,我看到了这一行

X-CSRF-Token:"U05vc3J6YmVmPgAaFh8gAiMvPBQTETMrBjc8JRA4GywBBwMGAzA7Og=="

我在 html 页面的元参数中看到了相同的值(对于 cookie 请求也是如此)。

Ajax 请求如下所示。我尝试将 crsf 值添加到标头和 http 参数,但没有效果。我也没有beforeAction() 方法

   var noCookieResp = $.ajax({
        //beforeSend: function(request){
        //    request.setRequestHeader("X-CSRF-Token", $('meta[name="csrf-token"]').attr("content"));
        //},
        type: 'POST',
        url: window.location.origin + '/frontend/web/viewer/noc',
        data: {
            id: postId,
            _csrf : yii.getCsrfToken()
        },
        error: function(e) {
            console.log(e);
        },
        success: function(){
            console.log(noCookieResp.responseText);
        }
    });

有什么建议吗?抱歉英语不好

【问题讨论】:

    标签: php ajax yii2 csrf


    【解决方案1】:

    在大多数情况下,当用户因为未登录而禁用 cookie 时,我们不需要 csrf_token。因此,您可以在允许访客访问的某些操作或控制器中禁用 csrf。

    public function beforeAction($action) {
         $this->enableCsrfValidation = false;
         return parent::beforeAction($action);
    }
    

    【讨论】:

    • 我认为这对我有帮助。我将此代码添加到控制器的 beforeAction 函数中,仅用于处理 ajax 请求:if(Yii::$app-&gt;request-&gt;isAjax){ $this-&gt;enableCsrfValidation = false; } return parent::beforeAction($action); 但它仍然是安全的吗?
    • 如果我不在 ajax 中使用 csrf,它是否安全?真的吗?
    • @frops 不安全,ajax也可以被csrf攻击
    • @NgôVănThao 如果我在 ajax-request 上检查 csrf,那么是安全的,我错了吗?
    • @frops 我不明白你的意思
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 2012-01-05
    • 2014-12-13
    • 2016-05-20
    • 2012-06-07
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多