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' =&gt; 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 &gt; cookies &gt; headers &gt; parameters &gt; XSRF-TOKEN 内,我在 2 个帖子中有相同的令牌。

Request &gt; session &gt; attributes &gt; _token 内,我在 2 个帖子中有 2 个不同的令牌。


编辑 4:

好吧,如果你把 session_start(); 放在 routes.php 的顶部,在 &lt;?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 行随机帖子的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:laravel 可翻译插件

win 怎么laravel命令

laravel 安装失败

laravel validator怎么验证整数

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

laravel和mongo怎么搭配使用