Cakephp/php用户会话交换为我们的客户的一个子集


Cakephp/php user sessions swapping for a subset of our customers

有一个错误,我们无法复制,它涉及到我们企业客户的一个特定区域的用户交换。例如,用户在登录页面上以自己的身份登录,而当到达家中时,他们是另一个用户。

这似乎是意外的会话劫持,以下是线索:

  • cakephp的安全性设置为低(这只意味着cookie没有重写每个页面加载,并且cookie不做用户代理检查)
  • 我们的cookie被设置为不关心子域名(.example.com而不是example.com)
  • 企业用户如果登录到错误的区域,使用302重定向(我们应该使用303吗?)
  • 有一个301意外发出,但用户可以复制
  • 所有受影响的用户都在一个路由器后面,通过Sprint MPLS共享互联网
  • 所有受影响的用户可能正在使用客户发出的计算机
  • 他们的IT部门声称没有代理缓存,也没有远程VPN访问,但他们声称能够从家用电脑和网络外复制问题。

由于我们无法以任何方式复制这个问题,我们只能假设这个问题是特定于他们的网络的。

我们如何证明他们的网络/计算机导致了会话交换?或者,当其他用户没有遇到此问题时,我们端的什么配置可能导致此问题?

(编辑/更新)

响应评论提供的一些方向-我们的流量不够大,无法发送重复的id。(统计概率太低,无法看到我们所看到的客户复制)。

参见:

  • Zend框架会话交换问题
  • 为什么php每次在测试环境(WAMP)中生成相同的会话id ?
更新:

我们使用FCGI,显然需要mod_php来理解x_forwarded_for

  • 这个函数调用有什么问题?

这可能是注销时会话无效的问题。请确保会话中的所有变量都被正确终止,或者显式地null终止会话中的每个对象,然后使会话无效。

第二个原因可能是使用变量检查代码中的静态变量。不正确地使用静态变量也可能导致这种间歇性问题。

使用logger记录映射到用户id的会话id,这可以缩小您的问题范围,并帮助您了解究竟发生了什么。

在登录操作中使现有会话无效,创建新会话并将内容复制到新会话中会有很大帮助。

首先,不要认为客户有错。这可能是他们或你的问题。在测试之前不要做任何假设。

不管是谁的错,你都有责任去解决或帮助解决它。

首先,让一个用户变成另一个用户通常是Session ID问题的结果。您在Cake中设置的安全级别不会为每个请求重新生成会话ID。

我将首先将$session->id()记录为本地网络内外的用户。然后比较会话id是否始终相同或始终为空字符串。解决这个问题的一个方法是为每个用户生成一个唯一的id。

如果Session ID在每个实例中都是唯一的,你可能需要在负载下测试它。

关键是先测试,然后根据发现得出结论,而不是猜测。