L5随机TokenMismatchException

时间:2015-03-21 16:20:31

标签: php laravel csrf laravel-5

我在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网络工具,我可以确认所有请求都将完全相同的数据发送到服务器。

所以似乎令牌在服务器端发生了变化。奇怪的是,会话文件中的令牌似乎没有改变,错误的令牌总是一个我以前没见过的字符串,但总是以某种方式恢复到原始字符串。

这种情况经常发生,所以真的很烦人。首先我认为它可能是关于数据库会话驱动程序的东西,但我现在正在使用文件驱动程序,它仍在发生。

更新

我一直有这个问题。我使用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.*"的唯一内容是{{1}}。所有作曲家包都是最新的。

一旦我有关于这个非常奇怪的问题的更多信息,我会立即更新这个问题。

另一次更新

我创建了一个新的L5项目,并添加了一些最小的代码来重现这个错误。我所做的更改可以看作here(以及完整的测试项目)。我现在将尝试使用这个项目进行一些调试。

1 个答案:

答案 0 :(得分:6)

对于某些人来说,这是Laravel 5的一个已知问题。

此主题有一个开放的Github问题单:https://github.com/laravel/framework/issues/8172

原因尚不清楚,而且已经持续了一段时间。有很多聪明人在研究它 - 但问题的明显随机性使得调试变得困难。

我建议您将您的信息提供给该机票,并留意那里以获取更多信息。