如何防止多个客户端使用相同的会话 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 的多个请求来保护会话免遭劫持的做法简直是荒谬可笑的,而且会破坏会话的整个目的。