在 asp.net 中,我可以像往常一样使用表单身份验证登录,复制我们的 auth cookie 值,注销,使用 Chrome 的“编辑此 Cookie”插件将 cookie 人工添加到客户端,刷新(匿名)登录页面嘿,我又重新登录了。这似乎是一个漏洞 - 有什么方法可以使用标准表单身份验证来修复它,还是我必须做一些事情,比如使用一个自定义的 Authorize 属性来覆盖 asp.net mvc 中的现有属性?
3 回答
我不认为这本身就是一个错误。在表单身份验证期间发生以下情况
- 您向服务器提供用户名/密码
- 服务器验证用户名/密码
- 如果有效,则服务器将加密的身份验证票证 (cookie) 发送到客户端,其中包含到期时间(在 web.config 表单身份验证部分中设置)和用户名(全部加密)
- 在每个需要授权的请求上,cookie 在服务器上被解密,检查过期时间并使用用户名来查看是否授权(或获取请求资源的角色)。
- 当您注销时,cookie 上的过期时间已设置为过去,因此,它不再是有效的 cookie
现在,至于为什么您会看到您所看到的……您在注销之前复制了 cookie。因此,您复制的 cookie 永远不会注册注销(移动的过期时间)。当您重新附加时,您仍然有一个有效的身份验证 cookie。现在,如果您的表单身份验证超时设置为...假设 20 分钟...如果您复制 cookie 并等待 21 分钟,此方法将失败,因为到那时,它已过期。
Cookie 总是很脆弱,我们对此无能为力。我们能做的是防止有人窃取cookies。
关于 ASP.NET MVC,它可以很好地避免窃取 cookie。作为安全性的一部分,它默认执行的一些主要操作是:
对呈现到视图的字符串进行编码(如果您使用的是 Razor,则不知道其他人)以防止 XSS 攻击。
请求验证(阻止潜在危险数据到达应用程序)。
阻止对 JSON 数据的 GET 访问。
使用 Antiforgery Helpers 防止 CSRF
关于 cookie,Microsoft 提供了HttpOnly
功能,这有助于从 javascript 中隐藏 cookie。您所说的表单身份验证是一个HttpOnly
cookie,这意味着有人无法通过 JavaScript 窃取它,而且它更安全。
您可以使用任何cookie/s 来做到这一点。您可以检查/复制任何给定域中的所有 cookie,并根据需要进行欺骗。您可以(仅)对自己执行此操作,因为它是您的 PC(或登录到 PC 的用户)。显然,如果您在共享 PC 上,这是一个问题(在您的所有信息中)。
“复制您的 cookie”的行为实际上是恶意软件试图窃取/劫持您的身份(或某些网站上的当前会话)的一种方式。也就是说,除非你有一些恶意软件,否则你不能只是“复制”别人的 cookie。
假设logout
完成,您可以要求用户关闭他们的浏览器,以便从(文件)系统中删除过期的 cookie。