【问题标题】:Yii All post requests fail CSRF validation only for first time sessionYii 所有 post 请求仅在第一次会话时未通过 CSRF 验证
【发布时间】:2015-05-21 04:20:32
【问题描述】:

我正在使用这篇文章来使用会话获取/设置 csrf 令牌,而无需更改代码

http://www.yiiframework.com/wiki/274/how-to-validate-csrf-token-with-session/

如果用户第一次登陆页面然后执行 POST 请求,所有请求都会失败。 (所有 POST 请求都发送 CSRF 令牌)。但是如果用户刷新页面,那么重新加载后的所有 POST 请求都会通过!

经过大量调试,我发现我在第一页加载时收到的 CSRF Token 将不再与会话中保存的值匹配。当用户重新加载页面时,csrf 令牌被更改为 CSRF 会话的值,并且所有 POST 请求都成功。

我已将会话自动启动设置为 true。我也尝试在会话中使用 cookie,但同样的问题发生了。我也尝试了用户状态。

自从我第一次开始这个为期 1 年的项目以来,我可能就遇到了这个问题,但直到现在才注意到它,它只有在第一次加载页面时才会发生。

我所有的控制器都扩展了一个父控制器,它扩展了控制器。它只有一个构造函数和init。 我试图找出它是否被调用了两次,但到目前为止什么都没有。

 public function __construct($id,$module=null)
 {

       parent::__construct($id,$module);    

        // do stuff
 }
 public function init()
{       
        // do stuff
 }

以下是页面加载后的 POST 请求示例

$.ajax({
   type: "POST",
   data: {name:xName,id:xID,YII_CSRF_TOKEN:CSRFTokenValue},
   url: "/page/logPageView/",
   success: function(data){
   }
});

关于我应该在哪里看的任何想法?这种奇怪的行为有什么可能的原因吗?

【问题讨论】:

标签: php session yii csrf


【解决方案1】:

我发现问题与缓存有关。我最近添加了 cloudflare 缓存,这导致第一次用户从缓存的内容中获取旧的 CSRF 令牌。这就是我无法在本地主机或测试服务器上重新生成它的原因,因为它们没有被缓存。

我通过添加一个 ajax 调用来解决这个问题,以便在页面加载时获取一个新的令牌,然后将此令牌用于以后的帖子。并确保“getFreshToken”调用未被缓存。

【讨论】:

猜你喜欢
  • 2014-04-10
  • 2015-07-21
  • 2013-09-07
  • 2015-01-02
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多