【发布时间】: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){
}
});
关于我应该在哪里看的任何想法?这种奇怪的行为有什么可能的原因吗?
【问题讨论】:
-
在 CHttpRequest::validateCsrfToken() 中添加一些调试信息 - 转储 $userToken 和 $cookies 变量 - 它可能会让你有所思考 - github.com/yiisoft/yii/blob/1.1.15/framework/web/…