Laravel Session 总是改变 Laravel 5.4 中的每个刷新/请求

Posted

技术标签:

【中文标题】Laravel Session 总是改变 Laravel 5.4 中的每个刷新/请求【英文标题】:Laravel Session always changes every refresh / request in Laravel 5.4 【发布时间】:2017-08-03 19:24:47 【问题描述】:

所以标题基本上说明了一切,我使用的是 Laravel 5.4、php 7.1,并且在我的本地机器上会话工作得很好。基本上当我每次尝试登录或重新加载页面时,我都会收到一个破坏一切的新 CSRF 令牌。我使用数据库作为我的会话驱动程序,它在我提出的每个请求中都会在数据库中创建一个新条目。当我第一次升级时,这发生在我的本地机器上,但要修复它,解决方案是更新我的 cookie_domain 环境变量,然后我让它工作了。但是,在我的新服务器上,我尝试了所有我能想到的域,但仍然无法正常工作。

这是我所知道的,

会话 cookie 未保存在 Chrome -> 应用程序 -> Cookies 下,这确实显示在我的本地设置中。

CSRF-TOKEN 在每次页面重新加载时都会获得一个新值,但 XSRF-TOKEN cookie 存在并在每次重新加载时保持其值。

本地服务器和我的新服务器都运行完全相同的 git 分支,并且都运行 apache 2.4、Laravel 5.4 和 PHP 7.1,所以这让我认为这是某种配置问题。本地和服务器都运行centos 7

每个请求都会在数据库中创建一个新会话,这发生在 get、post 和 ajax 请求中。

我认为这是某个地方的配置问题,但我不知道,任何帮助将不胜感激。如果有帮助,请在我的初始页面加载的响应标题下查看 sid 和 laravel 会话都存在于“Set-Cookie”命令下,但实际上都没有保存到本地应用程序 cookie 存储中。

编辑/更新 所以最初我回答了我自己的问题,说我认为是修复,但是这个修复不再有效,我到处都是这个问题。所以更新我的问题和以前一样,尝试做任何事情都会创建一个新会话,重新加载和导航几个页面会由于 ajax 请求和其他此类活动而添加数十个会话。

我现在的设置是这样的,我有 3 台服务器,这三台服务器都运行克隆映像,这意味着它们是相同的,但是其中一台是子域 development.mysite.com,另外两台是负载平衡的主站点 mysite.com。所以我能想出的唯一可能的解释是,由于我的子域,laravel 无法理解我的设置。我已经在 .env 文件(development.mysite.com、.mysite.com、mysite.com、.development.mysite.com 等)中尝试了所有可能的 COOKIE_DOMAIN 组合,并且我已经向我的主机添加了几十个选项,全部都没有利用。关于这可能是什么的任何想法?

**编辑/更新#2 ** 除此之外,我发现它可能与我使用的域有关,它是一个子域,其中主域也在运行 laravel,如果是这样,我将不得不弄清楚如何以及为什么。

【问题讨论】:

我遇到了同样的问题,我认为这个问题只发生在本地,当您更改浏览器时它就会出现。 你解决了这个问题吗? 【参考方案1】:

我发现解决方案是 2 个部分,不知道为什么它会有所不同,因为它是相同的操作系统和设置。

第 1 步确保 COOKIE_DOMAIN 设置正确且没有端口号(在 .env 中或直接在 /config/session.php 中,无论您使用哪个)

第 2 步确保 /config/sessions.php 中的 cookie 名称 ('cookie' => 'whatever') 中没有下划线。 Laravel 显然对此有疑问。

【讨论】:

COOKIE_DOMAINSESSION_DOMAIN? 对我来说,问题是一个“。” (点)在 cookie 名称内(本地开发服务器上的 Ubuntu 19.10 上的 Laravel 6. 2)。你为我指明了正确的方向。【参考方案2】:

我们也遇到了这个错误,这似乎可以解决问题:

• 检查您的storage/ 文件夹的权限是否正确

• 尝试禁用页面中的所有 javascript(通过导航器或代码内部禁用)并确保 'http_only' => true,

• 尝试使用和不使用 HTTPS

• 确保 SESSION_DRIVER 变量不为空

• 尝试在'encrypt' => false,'encrypt' => true, 之间切换

• 尝试更改 cookie 名称'cookie' => 'laravelsession',

• 尝试将您的 SESSION_DOMAIN 设置为您的实际域或 null

• 尝试在'secure' => env('SESSION_SECURE_COOKIE', false), and 'secure' => env('SESSION_SECURE_COOKIE', true), 之间切换

在每一步之后,这个错误似乎都得到了修复,但不知何故,cookie 仍然没有设置在导航器中,直到我们也在开发中使用 HTTPS。

很抱歉无法提供 100% 的修复,但遇到完全相同的问题,我想与您分享我的经验。

【讨论】:

据记录,这与我的问题完全无关,我的问题与子域有关,任何寻找答案的人都可以在这里找到解决方案github.com/laravel/framework/issues/19109 我爱你。你刚刚救了我的***。 谢谢。 '安全'配置让我绊倒了。 s/o(我)很久以前在生产中将其硬编码为 true,这当然在 dev(localhost)中不起作用。傻我 感谢@Mathieu 这一项工作。你节省了我的时间 :)【参考方案3】:

此问题的主要原因是 laravel 无法在服务器端保存会话数据。

使用文件作为会话存储,通常是权限问题,[如果你在 centos 上检查 SELINUX],laravel(这意味着 apache 或 nginx 或任何你的进程运行的用户)应该具有读写权限在存储会话文件的文件夹上[通常是项目根/存储文件夹]。

发生这种情况的另一个原因是当您将数据库用作会话存储并手动创建会话表时,错误地将 id 列设置为 bigint(20) 类型或任何其他不匹配的列。

这再次意味着 laravel 无法存储会话数据。 在这里查看我的详细答案https://***.com/a/45340647/7260022

最后一点是关于上面提到的cookie和域设置。希望这有助于为将来遇到此问题的任何人查明问题。

【讨论】:

【参考方案4】:

如果使用 nginx 缓存,请禁用它。对我来说,它解决了同样的问题。

【讨论】:

【参考方案5】:

我在 Laravel 5.6 中也遇到了类似的问题。我的应用程序正在运行,并且从未遇到过有关身份验证的问题。突然我收到一个"419 | page is expired" 错误,每次刷新都会生成 CSRF 令牌。

最后我发现浏览器阻止了应用程序设置的 cookie。我仍然没有找到永久修复,但允许或删除那些被阻止的 cookie 暂时解决了这个问题。

我的config/sessions.php* 配置文件没有任何变化,应用程序在本地服务器上运行良好。

【讨论】:

以上是关于Laravel Session 总是改变 Laravel 5.4 中的每个刷新/请求的主要内容,如果未能解决你的问题,请参考以下文章

laravel - CSRF 令牌总是改变

laravel 5.8 实现消息推送

如何从 Windows 命令提示符在 Laravel 中运行 PHPUnit

[MRCTF2021]ez_laravel复现

无法更改 Laravel 会话数组中的单个值

Laravel 4 - CSRF 令牌永远不会改变