防止会话劫持
如何防止多个客户端使用相同的会话 ID?我问这个是因为我想添加一个额外的安全层,以防止我的网站上的会话劫持。如果黑客以某种方式找出了另一个用户的会话ID并使用该SID发出请求,我如何检测到服务器上共享单个SID的不同客户端,然后拒绝劫持尝试?
编辑
经过仔细考虑,我接受了Gumbo的答案,因为我已经意识到,由于无状态HTTP协议的限制,我所要求的是不可能的。我忘记了HTTP最基本的原则是什么,现在我想到这个问题似乎有点微不足道。
让我详细说明我的意思:
用户 A 登录 example.com 后,他会获得一些随机的会话 ID,为简单起见,让它成为 'abc123'。此会话 ID 作为 Cookie 存储在客户端,并使用服务器端会话进行验证,以确保登录的用户在从一个网页移动到另一个网页时保持登录状态。当然,如果HTTP不是无状态的,则此cookie不需要存在。因此,如果用户 B 窃取了用户 A 的 SID,并在他的计算机上创建了一个值为“abc123”的 Cookie,他将成功劫持用户 A 的会话,但服务器根本无法合法地识别用户 B 的请求与用户 A 的请求有任何不同,因此服务器没有理由拒绝任何请求。即使我们列出了服务器上已经处于活动状态的会话,并尝试查看是否有人正在访问已处于活动状态的会话,我们又如何确定是另一个非法访问会话的用户,而不是已经使用会话ID登录的同一用户, 但只是尝试用它提出另一个请求(即导航到不同的网页)。我们不能。正在检查用户代理?可以欺骗 - 但作为纵深防御措施仍然很好。IP地址?可以出于合法原因进行更改 - 但我建议检查IP的前两个八位字节,而不是根本不检查IP地址,因为即使是数据计划网络上的用户,由于完全合法的原因不断更改IP,通常也只有IP更改的最后两个八位字节。
总而言之,无状态HTTP使我们永远无法完全保护我们的网站免受会话劫持,但是良好的做法(如Gumbo提供的做法)足以防止绝大多数会话攻击。因此,试图通过拒绝同一 SID 的多个请求来保护会话免遭劫持简直是荒谬的,并且会破坏会话的整个目的。