Yii 所有发布请求仅在首次会话时失败 CSRF 验证


Yii All post requests fail CSRF validation only for first time session

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

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

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

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

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

自从我第一次

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

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

 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){
   }
});

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

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

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