有一个错误,我们无法复制,它涉及到我们企业客户的一个特定区域的用户交换。例如,用户在登录页面上以自己的身份登录,而当到达家中时,他们是另一个用户。
这似乎是意外的会话劫持,以下是线索:
- 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在每个实例中都是唯一的,你可能需要在负载下测试它。
关键是先测试,然后根据发现得出结论,而不是猜测。