繁体   English   中英

Laravel session id 随每个请求而变化

[英]Laravel session id changes with each request

我有一个 Laravel 5.0 站点,其中前端 JS 对后端 Laravel 代码进行了很多 ajax 调用。 我注意到在每个 ajax 请求中,我每次都会在响应中获得一个新的“laravel_session”cookie 值。 我猜这是一些防止 session 劫持的安全机制。

但是我认为这会导致我的网站出现问题,因为我的 ajax 调用通常是并行发生的,而不是顺序发生的。 在触发下一个呼叫之前,我不会等待响应。

考虑这种情况

. Ajax 调用 1 - 请求 - laravel_session cookie = '1234'

. Ajax 调用 1 - 响应 - laravel_session cookie = '2345'

. Ajax 调用 2 - request- laravel_session cookie = '2345'

. Ajax 调用 3 - request- laravel_session cookie = '2345'

. Ajax 调用 2 - 响应 - laravel_session cookie = '3456'

. Ajax 调用 3 - 响应 - session 不再有效

有没有办法解决?

我还应该注意,会话在 config/session.php 中设置为“生命周期”=> 120,

在此处输入图像描述

配置/会话.php

你是对的,它是一种安全机制。 要禁用它以进行测试,请在 Kernel.php 中注释掉这一行:

\App\Http\Middleware\EncryptCookies::class

然后您将在 cookie 查看器中看到会话 ID,并且它不会更改。

您可以通过 Google for HTTP 加密 cookie 来了解这种做法。 既然我们在每个网站上都使用 HTTPS,是否有必要使用这种旧做法仍然存在争议。

您的域无效。 您需要查看config.session.domainconfig.session.path

同样的问题发生在我身上,后来发现我正在使用

protected $middleware = [
     \Illuminate\Session\Middleware\StartSession::class,
     \Illuminate\View\Middleware\ShareErrorsFromSession::class
];
protected $middlewareGroups = [
     'web' => [
          \Illuminate\Session\Middleware\StartSession::class,
          \Illuminate\View\Middleware\ShareErrorsFromSession::class
     ]
]

在 $middleware 和 $middlewaregroups 中,它正在创建一个在不同路由之间移动的新会话 ID。

我有同样的问题,我尝试了很多解决方案,但对我没有任何效果。

我的情况:只有当会话驱动程序设置为database时,令牌才会在每个请求中不断变化,并且它在fileRedis驱动程序上工作得很好。

经过大量调试,我发现问题不在于会话配置,而是来自数据库中会话表中的payload列。

我将payload列从 text 更改为longText ,它起作用了!

关于会话有一些重要的事情。 首先是饼干时间。 如果您的 Laravel 应用程序的时区是 UTC,但您计算机的时区是 +3,那么如果您将 cookie 生命周期设置为 120(两小时),那么浏览器将立即删除 cookie。 您必须延长 cookie 的寿命。

其他选项是加密。 Cookies 始终是加密的。 如果在sessions.php文件storage/framework/sessions文件夹中设置encrypt=true ,将被加密。 有时这会导致问题。 如果 session 不保留,则尝试将encrypt设置为false 之后,您可以看到 session 文件未加密并且具有“序列化”文本。 然后你可以在那里看到你的 session 变量。

其他选项是sessions.php文件中的domain变量。 您必须正确设置它或保留它null 域首先不能有http(s):// 仅在其中写入域(例如 yourdomain.com、yourdomain.test、yourdomain.host、 www.yourdomain.com 、subdomain.yourdomain.com 等...)

其他选项是关于driver 如果将其设置为database ,则必须确保表列有足够的大小来存储大 session 数据。 如果将其设置为file ,则必须确保storage/framework/sessions文件夹是可写和可读的。

还有一个“小”(我认为很重要)的把戏。 不要在 session 中使用通用关键字。 例如,不要使用“令牌”键。 使用 session 的特定名称。 这是错误的: session(['token' => $result->token]) ,但这更好: session(['backend_remote_token' => $result->token])

摇滚乐...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM