Yii2 Csrf关闭cookie

时间:2015-06-22 18:06:06

标签: php ajax yii2 csrf

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

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

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

<?= Html::csrfMetaTags() ?>

打开Cookie时,所有工作都正常。 http头也有一个X-CSRF-Token,女巫值与cookie的_crsf param不同。 当我尝试在我的localhost上禁用cookie(为nocookie用户测试网站)时,ajax请求无法正常工作。 (错误400错误请求)。 在http请求标头中,我看到了这一行

X-CSRF-Token:"U05vc3J6YmVmPgAaFh8gAiMvPBQTETMrBjc8JRA4GywBBwMGAzA7Og=="

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

Ajax请求看起来像这样。我尝试将crsf值添加到标头和http param,但没有任何效果。我也没有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);
        }
    });

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

1 个答案:

答案 0 :(得分:0)

在大多数情况下,当用户禁用cookie时我们不需要csrf_token,因为他们没有登录。所以你可以在允许访客访问的某个操作或控制器中禁用csrf。

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