TokenMismatch ONLY 某些浏览器 - Laravel 5 Fresh/Production

Posted

技术标签:

【中文标题】TokenMismatch ONLY 某些浏览器 - Laravel 5 Fresh/Production【英文标题】:TokenMismatch ONLY Certain Browsers - Laravel 5 Fresh/Production 【发布时间】:2015-06-05 12:15:18 【问题描述】:

一个示例浏览器: IE 11: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) 像 Gecko

会话于 22:46:56 开始。填写表格。 22:53:18 提交表单,收到TokenMismatchException。所以只过了 6 分钟。

会话开始:

Apr 02 22:46:56 production.INFO: Session "start":1428040016,"id":"8040cc779df0330855f8fa30483af63557aaf9c4","token":"L3nU4ehseV5w1iXy86g18FsgnVs6sAcDNjTUZ5QV","ip":"74.XX","method":"GET","url":"https://sub.domain.com/place-st","ua":"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" []

用户在 6 分钟后提交表单:

Apr 02 22:53:18 production.DEBUG: REQUEST SESSION token: 8L3pba9ALBVBcrvIPM5wnTl7bP0slSIrjCAkfWzh [] [] Apr 02 22:53:18 production.DEBUG: REQUEST INPUT _token: L3nU4ehseV5w1iXy86g18FsgnVs6sAcDNjTUZ5QV [] [] Apr 02 22:53:18 production.DEBUG: REQUEST HEADER X-CSRF-TOKEN: [] [] Apr 02 22:53:18 production.DEBUG: REQUEST HEADER X-XSRF-TOKEN: [] [] Apr 02 22:53:18 production.DEBUG: REQUEST URL: https://sub.domain.com/requests/post [] []

服务器变量:

Apr 02 22:53:18 production.DEBUG: array ( 'USER' => 'forge', 'HOME' => '/home/forge', 'FCGI_ROLE' => 'RESPONDER', 'APP_ENV' => 'production', 'QUERY_STRING' => '', 'REQUEST_METHOD' => 'POST', 'CONTENT_TYPE' => 'application/x-www-form-urlencoded', 'CONTENT_LENGTH' => '867', 'SCRIPT_FILENAME' => '/home/forge/doamin.com/public/index.php', 'SCRIPT_NAME' => '/index.php', 'REQUEST_URI' => '/requests/post', 'DOCUMENT_URI' => '/index.php', 'DOCUMENT_ROOT' => '/home/forge/doamin.com/public', 'SERVER_PROTOCOL' => 'HTTP/1.1', 'GATEWAY_INTERFACE' => 'CGI/1.1', 'SERVER_SOFTWARE' => 'nginx/1.6.2', 'REMOTE_ADDR' => '74.XX', 'REMOTE_PORT' => '56563', 'SERVER_ADDR' => '104.XX', 'SERVER_PORT' => '443', 'SERVER_NAME' => 'doamin.com', 'HTTPS' => 'on', 'REDIRECT_STATUS' => '200', 'HTTP_ACCEPT' => 'text/html, application/xhtml+xml, */*', 'HTTP_REFERER' => 'https://sub.domain.com/place-st', 'HTTP_ACCEPT_LANGUAGE' => 'en-US', 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko', 'HTTP_CONTENT_TYPE' => 'application/x-www-form-urlencoded', 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', 'HTTP_HOST' => 'sub.domain.com', 'HTTP_CONTENT_LENGTH' => '867', 'HTTP_CONNECTION' => 'Keep-Alive', 'HTTP_CACHE_CONTROL' => 'no-cache', 'PHP_SELF' => '/index.php', 'REQUEST_TIME_FLOAT' => 1428040398.7879851, 'REQUEST_TIME' => 1428040398, ) [] []

会话/Cookie

Apr 02 22:53:18 production.DEBUG: REQUEST PATH: requests/post [] [] Apr 02 22:53:18 production.DEBUG: COOKIE: array ( ) [] [] Apr 02 22:53:18 production.DEBUG: SESSION: array ( '_token' => '8L3pba9ALBVBcrvIPM5wnTl7bP0slSIrjCAkfWzh', ) [] []

HTTP 请求:

Apr 02 22:53:18 production.DEBUG: POST /requests/post HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Encoding: gzip, deflate Accept-Language: en-US Cache-Control: no-cache Connection: Keep-Alive Content-Length: 867 Content-Type: application/x-www-form-urlencoded Host: sub.domain.com Referer: https://sub.domain.com/place-st User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko _token=L3nU4ehseV5w1iXy86g18FsgnVs6sAcDNjTUZ5QV&var=value&var2=value2&etc... [] []

【问题讨论】:

这可能是一个重要的错误,可能在 gitthub laravel/laravel 上提出问题 @jhauraw 你能检查我的答案吗? 1分钟内提交表格会不会出现这种情况?还是只有6分钟? 5分钟等呢? @TheShiftExchange 提交表单的不是我们,而是不同浏览器上的众多用户。是的,它发生在从会话开始到表单提交的不同时间间隔。时间上没有规律,只是所有实例都小于会话生命周期。 【参考方案1】:

这听起来很多类似于 Laravel 的已知问题:https://github.com/laravel/framework/issues/8172

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

我建议您向该票证提供您的信息,并留意那里以获取更多信息。具体来说,我们需要尽可能多的有关您的服务器配置和应用程序配置的信息 - 这样我们就可以尝试复制该问题。到目前为止,复制的确切方法尚不清楚,因此很难修复。

【讨论】:

是的,随机性令人沮丧。在繁忙的系统上,我们每天收到 2-3 个。我会尽快在问题单上发布一个场景。【参考方案2】:

这可能是一个长镜头,但问题的根源可能是 IE 的兼容模式以及使用这些模式的不同会话。

您可以尝试在获取和发布页面顶部添加此行吗:

header("X-UA-Compatible: IE=Edge");

【讨论】:

按照通常的 Twitter Bootstrap UI 标准,我们已经在每个获取页面上都有 X-UA 元标记。您是说我们应该在 POST 请求中添加 PHP 标头吗?在 中,已经:<meta http-equiv="X-UA-Compatible" content="IE=edge"> 此外,带有 Chrome 41 的 android 4.4.* 也有同样的问题,所以 IE 不是唯一的问题。 @jhauraw 你能分享你的帖子并获取视图和控制器吗? @jhauraw 有机会在任何 html 输出之前处理帖子。 我不确定我是否理解你的问题,但我想你问的是输出是在标题之前发送的吗?【参考方案3】:

问题很可能与浏览器无关。我相信有些人等待太久,会话到期。提交带有过期会话的表单后,会发生 TokenMismatchException。

对于调试,您可以在每个会话创建时保存到日志以查看它是否应该过期,您还可以在 session.php 中使用会话生命周期

【讨论】:

我用一个更好的例子更新了我的问题。会话未过期。

以上是关于TokenMismatch ONLY 某些浏览器 - Laravel 5 Fresh/Production的主要内容,如果未能解决你的问题,请参考以下文章

在标头中发送令牌时,Laravel TokenMismatch Exception

我无法使用 phpmyadmin,因为错误“令牌不匹配”

Cypress系列- Cypress 编写和组织测试用例篇 之 .skip() 和 .only() 的详细使用

Cypress系列- Cypress 编写和组织测试用例篇 之 .skip() 和 .only() 的详细使用

`ngcc --properties es2015 浏览器模块主 --first-only --create-ivy-entry-points 上的角度错误

MySQL ONLY IN() 等效子句