【发布时间】:2015-05-24 22:51:07
【问题描述】:
我在 Laravel 5 中得到随机的 TokenMismatchExceptions。在 tokensMatch() 函数中使用以下代码我一直在尝试调试这个奇怪的问题:
Log::debug($request->session()->token(). ', ' . $token);
输出如下:
[2015-03-21 17:04:22] local.DEBUG: XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT
[2015-03-21 17:04:34] local.DEBUG: XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT
[2015-03-21 17:04:36] local.DEBUG: snE0IERJ1VY0o4qmSMuHb4wH9lhQUf5ZtVObOFnR, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT
[2015-03-21 17:04:36] local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:47
Stack trace:
[...]
[2015-03-21 17:07:30] local.DEBUG: XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT
如您所见,前 2 个请求成功,第 3 个请求失败,第 4 个请求再次成功。我一直在使用 Fiddler 和 Chrome 网络工具,我可以确认所有请求都向服务器发送了完全相同的数据。
所以看起来令牌在服务器端发生了变化。奇怪的是会话文件中的token似乎并没有改变,而且错误的token总是一个我以前没见过的字符串,但总是以某种方式恢复到原来的字符串。
这种情况经常发生,所以真的很烦人。首先我认为这可能与数据库会话驱动程序有关,但我现在正在使用文件驱动程序并且它仍在发生。
更新
我一直有这个问题。我使用 php artisan serve 在不同的 PC 和不同的项目上使用它。我也有它在不同的服务器和不同的项目(nginx 1.6.2,PHP 5.6.7)。
I'm not the only one with this problem.
调试非常困难,因为它是随机发生的,有时它会在一段时间内不显示,然后突然连续发生很多次,或者只发生一次。通过简单地重新提交 POST 请求,它有时会再次工作,或者有时会导致另一个异常。
我在所有项目中添加到composer.json 的唯一内容是"illuminate/html": "5.*"。所有作曲家包都是最新的。
一旦我有更多关于这个非常奇怪的问题的信息,我会更新这个问题。
另一个更新
我创建了一个新的 L5 项目,并添加了一些最少的代码来重现此错误。我所做的更改可以看到here(以及完整的测试项目)。我现在将尝试对这个项目进行一些调试。
【问题讨论】:
-
你是否对 Laravel 会话配置进行了任何修改?
-
是的,我已将驱动程序更改为数据库,但我已将其恢复为文件,因为我认为它可能导致了问题,但问题仍然存在。
-
你的设置是什么?即 Apache/Nginx、PHP 版本等。另外,你能告诉我存储在 cookie 中的令牌是否发生变化吗?您可以通过开发者工具 > 资源 > Cookies 做到这一点
-
另外,您是否在应用程序中使用任何 AJAX?
-
我使用的是 PHP 5.6.5 和内置的 Web 服务器。我没有在我的应用程序中使用任何 AJAX。令牌似乎没有改变,但我明天会更仔细地观察它。
标签: php laravel csrf laravel-5