2015-11-12 23 views
1

如何在不设置_csrf令牌的情况下获得Yii中的CSRF令牌?我尝试了很多东西,但没有任何效果。每次我尝试访问CSRF令牌时,它都会设置一个cookie。如何在不设置_csrf cookie的情况下在Yii中获得CSRF令牌?

<?//= Html::csrfMetaTags() // sets _csrf cookie. prevents Fastly CDN caching. ?> 
    <?php 
    $this->registerMetaTag(['name' => 'csrf-param', 'content' => '_csrf']); 
    $this->registerMetaTag(['name' => 'csrf-token', 'content' => 'xxx']); 
    Yii::$app->request->csrfToken; 
    ?> 

息率

$ curl -I http://localhost:81/xxx/web/shopping/search?q=toaster 
... 
Set-Cookie: _csrf=0fe1db8822f87506dd00feefb32438ffee24116b4ec717287e23422d81feb32ea%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22DkE4S5EYilTEkubAr-dWda5CV0y5XCEp%22%3B%7D; path=/; httponly 

它不设置cookie,当我注释掉Yii::$app->request->csrfToken;。之后我也尝试过立即取消设置cookie,但它会将Set-Cookie: _csrf=delete; expires=Thu, 01-Jan-1970 00:00:01 GMT;发送给浏览器。我也尝试将$enableCsrfCookie设置为false,但后来它设置了Cookie。

我需要使用POST和Javascript提交的注销链接的CSRF元标记。表单工作正常,因为它们将CSRF插入到<form>标记中。

+0

我发现,如果没有'_csrf' cookie,其他表单就无法正常工作。我的浏览器中只有一个旧的“PHPSESSID”和“_csrf”cookie。如果您从浏览器中删除这些cookie,则会发出错误的请求(#400)错误。所以你必须找到一种方法在你想要的页面上保存cookie或会话。 – Chloe

回答

1

我发现有第二个参数remove()阻止发送到浏览器,所以我可以得到令牌,然后立即删除cookie。

Yii::$app->response->cookies->remove('_csrf', false); 
相关问题