Laravel VerifyCsrfToken.php 第 53 行随机帖子
Posted
技术标签:
【中文标题】Laravel VerifyCsrfToken.php 第 53 行随机帖子【英文标题】:Laravel VerifyCsrfToken.php line 53 random on posts 【发布时间】:2016-03-28 02:50:42 【问题描述】:我从服务器随机收到一个 500 错误,其中包含一些(不是全部!)发布请求。在那个错误之后,我必须登录。
我实现了 PDF2htmlEX,它创建了使用 Web 字体等元素和资源制作的 html 页面。 要更改页面,我会发布一个帖子并获取数据,但是在某个页面(并不总是相同)之后,ajax 帖子返回 500 并且在数据(和日志)内部我看到了错误:
[2015-12-21 22:17:48] local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:53
Stack trace:
#0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#1 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#2 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#4 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#5 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#7 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#8 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#11 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#13 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#14 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(44): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#15 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#17 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\closure(Object(Illuminate\Http\Request))
#18 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#19 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(122): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#20 /path/to/laravel-project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#21 /path/to/laravel-project/public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#22 main
如文档中所述,我添加...
<meta name="csrf-token" content=" csrf_token() ">
在 app.blade.php 主视图模板中。 并在 js 脚本的开头添加:
$.ajaxSetup(
headers:
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
);
我用谷歌搜索了很多,并在 *** 中进行了搜索,但我无法弄清楚! 问题是有时会发生错误,但并非总是如此:似乎检查令牌被认为是有效的有限制。 我使用 ajax,所以带有令牌的元标记永远不会在帖子之间改变。
我使用的是 laravel 5.1(5.0 升级版)。
编辑 1:
我尝试增加 project/config/session.php: 中的 'lifetime' => 120,
值,如果值低(尝试 10)我可以在第 2 或第 3 个帖子(10-20 秒后)收到此错误,如果值为 hight(尝试 9999),我会在第 30 次以上的发布请求(4-5 分钟后)收到此错误。
编辑 2: 我在控制器和中间件中添加了一些日志。 我可以看到所有的 get 请求都返回了正确的值,post 错误,在 post 之后启动的其他 get 文件在帖子的 ajax 标头内具有相同的标记。
我看不到提供 post 请求的控制器方法的日志: 路线.php:
Route::post('/page', "RController@rPageData");
RController.php:
public function rPageData()
Log::info("I am there!"); # always showed except when error occurred.
# ... other code ...
编辑 3: 更多信息:我从 RController::rPageData() 中的正确帖子中删除了 $request,以及来自异常处理程序的错误发布请求。 我看到前两行 userResolver 和 routeResolver 在错误帖子中为空,并且在正确帖子中做得很好。似乎用户未通过身份验证,但下一个 GET 请求(如我的 EDIT 2 中报告的)是正确发出的。
错误帖子:
Request #40 ▼
#json: null
#userResolver: null
#routeResolver: null
...
好帖子:
Request #40 ▼
#json: null
#userResolver: Closure #144 ▶
#routeResolver: Closure #154 ▶
...
在Request > cookies > headers > parameters > XSRF-TOKEN
内,我在 2 个帖子中有相同的令牌。
在Request > session > attributes > _token
内,我在 2 个帖子中有 2 个不同的令牌。
编辑 4:
好吧,如果你把 session_start();
放在 routes.php 的顶部,在 <?php
标记之后,它会起作用。
注意:这不是解决方案。 GrahamCampbell(Laravel 的第二大贡献者)说:
永远不要那样做!因为那是完全不正确的。
附上reference
你有什么建议吗?
提前谢谢你!
【问题讨论】:
【参考方案1】:默认情况下,Laravel 中的会话持续 2 小时。当它们开始失败时,您是否在 2 小时内刷新了页面?
您可以增加会话在config/session.php
中的有效时间长度:
'lifetime' => 120 //120 minutes is 2 hours
【讨论】:
你好,我试过了:但它似乎是几秒钟:如果我设置 9999 需要很长时间(大约 5 分钟)才能在帖子中得到错误。如果我设置 10,它会在第二个帖子中返回错误。为什么不考虑分钟数?以上是关于Laravel VerifyCsrfToken.php 第 53 行随机帖子的主要内容,如果未能解决你的问题,请参考以下文章