我在 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 个请求成功,第三个请求失败,第四个请求再次成功。我一直在使用 Fiddler 和 Chrome 网络工具,我可以确认所有请求都将完全相同的数据发送到服务器。
所以看起来令牌在服务器端发生了变化。奇怪的是,会话文件中的令牌似乎没有改变,错误的令牌始终是我以前从未见过的字符串,但总是以某种方式恢复为原始字符串。
这种情况经常发生,所以真的很烦人。首先,我认为这可能与数据库会话驱动程序有关,但我现在使用文件驱动程序,而且这种情况仍然发生。
Update
我一直有这个问题。我在不同的电脑和不同的项目上使用它php artisan serve
。我也在不同的服务器和不同的项目上有它(nginx 1.6.2,PHP 5.6.7)。
我不是唯一一个有这个问题的人 http://laravel.io/forum/01-30-2015-laravel5-tokenmismatchexception-in-verifycsrftoken.
调试起来非常困难,因为它是随机发生的,有时它一段时间不会出现,然后突然连续发生多次,或者只发生一次。通过简单地重新提交 POST 请求,它有时会再次起作用,有时会导致另一个异常。
我唯一添加的东西composer.json
在所有项目中是"illuminate/html": "5.*"
。所有作曲家包都是最新的。
一旦我获得有关这个非常奇怪的问题的更多信息,我就会更新这个问题。
另一个更新
我创建了一个新的 L5 项目,并添加了一些最少的代码来重现此错误。可以看到我所做的更改here https://github.com/Naxiz/L5-CSRF-TestCase/commit/74d8222551cd0383c5887b108967b634c7af3b15(以及完整的测试项目)。我现在将尝试对该项目进行一些调试。