cookie 通常包含一个 sessionId 来跟踪登录的用户。
什么可以防止恶意用户伪造数百万个带有随机 sessionId 的请求并将它们发送到服务器,希望幸运地以现有的 session Id 结束,从而窃取随机会话?
唯一想到的是可能性的数量非常大。然而它不是无限的——我想一个恶意的僵尸网络所有者可以很容易地在短时间内进行数百万次尝试。
作为应用程序开发人员,我该如何防止这种情况发生?
谢谢 !
cookie 通常包含一个 sessionId 来跟踪登录的用户。
什么可以防止恶意用户伪造数百万个带有随机 sessionId 的请求并将它们发送到服务器,希望幸运地以现有的 session Id 结束,从而窃取随机会话?
唯一想到的是可能性的数量非常大。然而它不是无限的——我想一个恶意的僵尸网络所有者可以很容易地在短时间内进行数百万次尝试。
作为应用程序开发人员,我该如何防止这种情况发生?
谢谢 !
通过 sessionId 暴力破解的会话劫持可能吗?
可能不是。
owasp 说会话标识符应至少为 128 位长,以防止会话暴力破解。他们给出了这些示例计算:
对于 64 位会话标识符,假设熵为 32 位。对于大型网站,假设攻击者每秒可以尝试 1,000 次猜测,并且在任何给定时刻都有 10,000 个有效会话标识符。鉴于这些假设,攻击者成功猜测有效会话标识符的预期时间不到 4 分钟。
现在假设提供 64 位熵的 128 位会话标识符。对于一个非常大的网站,攻击者可能每秒尝试 10,000 次猜测,其中有 100,000 个有效会话标识符可供猜测。鉴于这些假设,攻击者成功猜测有效会话标识符的预期时间大于 292 年。
即使我们假设攻击者每秒可以执行 1000 万次尝试,在给出的最后一个示例中,他们仍然需要 3 个月才能获得有效的 id。
例如PHP的session id似乎默认为 160 位(我认为文档不太好),您也可以自己设置。
作为应用程序开发人员,我该如何防止这种情况发生?
除了使用足够强大的 ID 之外,您还可以将会话绑定到 IP,或将其链接到TLS 会话,这样,即使攻击者确实获得了会话(通过暴力破解或以其他方式),他们也无法使用它。您还可以阻止使用无效会话 ID 进行过多尝试的 IP。
tim 关于熵的答案在暴力破解 sessionId 的主题上是完美的。
但请注意,有更简单的方法可以窃取会话。例如,如果您通过 HTTPS(身份验证)发出会话,但随后又退回到 HTTP,那么现在您的会话以明文形式公开。可以假设通过 HTTP 的任何内容都会大声尖叫并向在线收听的每个人开放。
有针对性的攻击可能会诱使用户单击指向目标网站的 HTTP URL,并且攻击者会进行窃听,直到用户单击 URL 并通过 HTTP 发送会话。这就是为什么你应该为你的会话设置安全标志以确保它不会被发送,除非通过 HTTPS。
您可以将会话绑定到 IP,但请注意,如果许多用户位于 NAT 后面,他们可能会共享同一个 IP。因此,它并不是一个真正出色的安全解决方案。
即使您的整个会话都通过 SSL,浏览器中的漏洞仍然可能允许窃取会话;跨站点脚本可以窃取会话。为了安全起见,您应该解决所有这些问题,但归根结底,假设会话可能被盗,现在想想怎么办?
会话劫持的一种高级解决方案是同步令牌;这样,客户端浏览器每次向服务器发起 HTTP 请求时,服务器都会向客户端发送一个新的随机的足够复杂的 token 作为隐藏表单字段值,客户端必须在下一次请求中提交这个值作为隐藏的表单值。如果客户端提交了正确的会话(例如,从 cookie 中窃取),但没有最新的同步令牌,则说明有问题。该解决方案还可以防止跨站点请求伪造。如果您使用 SSL,则此解决方案也不能被中间人破坏。
不,如果会话 id 足够长并且有足够的熵。
如果这仍然让您担心,那么您可以使用密钥对 cookie 进行加密签名。
但是签名 cookie 不会有太大的效果:
如果签名是 128 位长,cookie 也是 128 位长,那么
cookie 可以被认为是一个 256 位长的 cookie。