处理具有多个前端的 PHP 会话


Handling PHP Sessions With Multiple Front End's

我们在HA中有2个pfSense FW,后面是主/从集群中的2个Zen负载均衡器,在这些后面是运行NGinx,PHP-FPM,PHP-APC的3个前端Web堆栈服务器。在同一网段中,主/从复制中有 2 个 MySQL 数据库服务器

前端的 PHP 会话应在 1440 秒后"清理":

session.gc_maxlifetime = 1440

.

当用户浏览器关闭时,Cookie 将过期:

session.cookie_lifetime = 0

今天,一位最终用户提醒我们,他们登录了(网站上基于 PHP 的登录表单),但被验证为完全不同的用户。至少可以说这很不方便。

ZLB设置为使用Hash:Sticky Client。他们应该在会话期间将用户粘在单个前端 (FE) 上。我能想到这种情况发生的唯一原因是两个 FE 生成了相同的 PHP 会话 ID,然后不知何故,用户不幸被 LB 定向到另一个 FE。

的问题很多,但现在,我只有几个:

  1. 我可以为每个前端服务器设置不同的 SESSID 名称吗?这会阻止 FE 生成相同的会话 ID 吗?这至少会导致用户注销,而不是以其他用户身份再次登录!
  2. 我们使用 lsyncd 和一大堆 inotifywatch 进程同步站点数据,但不同步包含会话的/var/lib/php 目录。我故意没有这样做...我现在在想也许我应该同步它。Lsyncd 将能够在修改会话后的大约 10 秒内跨所有 3 个前端复制会话文件。作为临时修复的好主意?

最后,我非常清楚客户端应该使用数据库来存储会话。这将完全消除它能够复制会话 ID。但是现在,他们不愿意在开发时间表中优先考虑这一点。

想法非常受欢迎,因为我正在努力寻找一个简单的出路,即使是作为临时措施。我不能让其他客户端以其他用户身份登录。这是一个巨大的禁忌。

谢谢!!

从您的问题来看,您对问题有些困惑 - 并且不清楚您要解决的问题。

今天,我们收到最终用户的提醒,他们登录了(网站上基于PHP的登录表单),但被认证为完全不同的用户

这里可能会发生几件事。

当用户浏览器关闭时,Cookie 将过期:

并非如此。根据浏览器的配置方式,大多数浏览器将在重新启动后保留会话 Cookie。由于这是在客户端控制的,因此您无法对此做太多事情。

前端的 PHP 会话应在 1440 秒后"清理"

这里的魔术词是"之后"——垃圾收集是随机触发的。会话文件可以保留更长的时间,默认处理程序将在 TTL 过期后愉快地检索和反序列化会话数据。

您是否控制应用程序代码?(如果没有,您的帖子在这里偏离主题)。如果是这样,那么您的代码中可能存在会话固定和劫持漏洞(但这是基于用户提供的描述 - 这通常是不精确和误导性的)。

内容也可能被不恰当地缓存在堆栈中的某个位置。

你没有说网站是在HTTP,HTTPS还是混合上运行,如果涉及HTTPS,SSL在哪里终止。这些是了解问题可能出现在哪里的关键。

接下来的步骤是确保:

  1. 您的代码中有注销功能,该功能会销毁会话数据更改会话 ID

  2. 在身份验证时更改会话 ID

  3. 基于会话的脚本返回适当的缓存信息(包括可变:Cookie 标头)两个系统几乎不可能同时生成相同的会话 ID。

真的,您想摆脱使用粘性会话。这并不难。

您的前端有 2 层,它们没有增加任何功能或性能价值,并且由于您使用的是粘性会话,因此实际上没有容量或弹性值!!谁把这个卖给你,都是一路笑到银行。