【问题标题】:Session is changed during post request会话在发布请求期间更改
【发布时间】:2015-01-23 21:22:47
【问题描述】:

我在 Laravel 4 中创建了应用程序。在 localhost 上一切正常,但是当我将应用程序上传到公共服务器时,我总是得到 TokenMissMatchException。经过一些调试后,我注意到每个 POST 请求都会创建两个令牌。 这是filter.php

Route::filter('csrf', function() {
    $token = Request::ajax() ? Request::header('x-csrf-token') : Input::get('_token');
    if (Session::token() != $token){
        throw new Illuminate\Session\TokenMismatchException;
    }
});

当我 var_dump() $token 和 Session::token() 我得到两个不同的值。 发布请求不是 ajax。 有人可以帮我解决这个问题吗?

编辑

当我删除CSRF保护时我可以登录,但是当我刷新页面时我退出了,所以它一定是会话有问题,因为它很快就失效了

【问题讨论】:

  • “经过一些调试,我注意到每个 POST 请求都会创建两个令牌” – 这是在哪里/如何发生的?
  • @CBroe 当我在 Firebug 中打开某个表单时,我可以看到 _token 值,然后如果我提交该表单,$token 包含该 _token 值,但 Session::token 包含不同的令牌。
  • 但是会话保持不变(所有请求的会话 ID 相同)?通过浏览器的开发人员工具中的网络面板,在加载了带有表单的页面后,去检查是否有任何意外的额外请求发生。
  • @CBroe 不,没有其他请求,我只收到 1 个 POST 请求
  • 我的意思是 before POST 请求,即(可能)GET 请求,它加载带有表单的 HTML 页面。 // 既然你说你在公共服务器上遇到这个问题,你能告诉我们地址吗,我们自己看看?

标签: php laravel laravel-4 token


【解决方案1】:

正如我所怀疑的,有两个请求应该只有一个......

在第 285 行,你有

<img src="http://www.spottunes.net/" id="imgWrap" …>

——这使得浏览器请求与再次加载文档相同的 URL。它当然拒绝显示为图像,因为它再次提供相同的 HTML 文档 - 但我假设请求 HTML 文档本身是触发生成表单令牌的原因,这就是你的问题:在原始 HTML 文档之后请求并为您的表单生成了一个令牌,再次请求相同的 URL,因此生成了一个 新 表单令牌 - 当您提交表单时,令牌不会'不匹配了。

所以删除那个img元素(或者给它一个实际图像的URL为src),问题应该就解决了。


顺便说一句。您还有一个从 http://www.spottunes.net/thumbs 到 http://www.spottunes.net/thumbs/ 的循环重定向,然后又从那里返回到 http://www.spottunes.net/thumbs 等等……与问题无关,但您应该调查并修复一些问题。

【讨论】:

  • 谢谢,我确实发现网站标志是问题所在,它指向丢失的图像并返回 404 错误,所以在我删除此图像后,一切正常。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
相关资源
最近更新 更多