防止 cookie 重放/cookie 被多个客户端使用

kil*_*yte 5 c# asp.net security cookies asp.net-mvc

在 ASP.NET MVC 中,防止有效 cookie 一次被多个客户端使用的“最佳实践”是什么?

在这种情况下,我们使用了 OWASP 的所有技巧。

  • 严格的 HSTS:每个页面均采用 HTTPS/SSL
  • Cookie 被列为仅 HTTPS
  • Cookie 被标记为安全
  • Cookie 的有效期很短
  • 还有代码可以防止跨站点请求伪造 (XSRF) 逐页更改值。

这一切都很好,可以防止用户更改值,但它不能防止不良行为者窃取整个 cookie 并在它仍然有效时在其他地方重新使用它(“cookie 重播”或“会话固定”,具体取决于谁)你问)。据我所知,没有标准的 .NET 配置或样板文件可以防止这种情况发生。

例如,用户 A 登录,其身份验证 cookie 会持续t几分钟。该用户 PC 上的恶意软件会忽略 cookie 上的仅 HTTP/安全设置,并能够检索实际存储的 cookie,并将其发送给我们的坏人。然后,不良行为者可以使用 cookie 编辑工具将其添加到浏览器中,并以用户 A 的身份连接到站点,直到 cookie 过期或用户 A 注销(使会话无效)。

理想情况下,是否可以配置 .NET,以便在发现两个客户端同时使用 cookie 时会话失效?

评论过的类似项目:

哦,SO社区,我们知道你们有多么喜欢“重复”。

外部修复建议:

  • 此页面建议在用户登录时在服务器端设置一个bool值。错误——这只会阻止坏人在目标用户注销后使用 cookie。它无法阻止坏人与目标用户同时进行活动。
  • StackExchange 上的此页面采用相同的方法,设置会话值。它也遇到同样的问题。
  • 即使Troy Hunt 经常引用的 OWASP 十大常见安全修复程序也可以帮助您保护 cookie,但没有演示防止同时使用有效 cookie 的方法。

Ste*_*eve 4

如果你的目标是

防止不良行为者窃取整个 cookie 并在其仍然有效时在其他地方重新使用它

那么答案是否定的。不可能。

从 http 请求中获取的信息量大致如下:

  1. 用户IP
  2. 标头(cookie、用户代理等)
  3. 请求正文
  4. 目标IP(您的服务器的IP)
  5. 网址

由于手头的信息量有限,你确实无法区分使用相同 cookie + 浏览器 + IP 的两个用户。

这就好像两个人使用同一台打印机打印了同一条消息,而您的任务是找出哪条消息是由谁打印的。

您能做的最好的事情就是每次用户想要执行任何敏感操作时都要求输入密码,并为其分配一次性令牌。(不方便用户使用)

或者,您可以通过仅在新 IP 与登录 IP 不匹配时才需要它来使其更加友好。(对移动用户不友好,因为他们的IP一直在变化)