表单身份验证 - Cookie重放攻击 - 保护

时间:2013-04-17 14:30:15

标签: asp.net security

我被问及有关我的ASP.NET网站表单身份验证的cookie重播攻击。

我遵循了以下建议,以防止任何攻击,但认为如果有人设法获取cookie(尽管只是很短的时间),该网站仍然很脆弱。有没有办法在注销时完全销毁表单身份验证会话,这样即使有人偷了cookie,也没有机会恶意使用它

随后的建议是

我们相信我们已经采取了所有可靠的步骤,以便在ASP.NET的范围内防止这种情况发生。请参阅下面的详细回复。

但是,我们已经实施了Microsoft建议的步骤来防范这种情况(请参阅http://support.microsoft.com/default.aspx?scid=kb;en-us;900111

·身份验证cookie永远不会写入客户端计算机,因此很难窃取。

·应用程序可以通过SSL运行,因此cookie永远不会通过非安全连接发布

·我们使用15分钟超时强制执行绝对过期,这意味着在该时间限制之后任何问题cookie都无用

·我们使用httpOnly cookies,以便没有人可以通过语法拦截或改变此cookie。

因此,即使上述预防措施被打破,我们认为这种预防措施不太可能,恶意用户只需要15分钟的时间来打破预防措施并成功登录

4 个答案:

答案 0 :(得分:5)

一个简单的想法是生成一个随机guid并将其存储在cookie的用户数据部分。然后,当用户注销时,您从用户数据中检索guid并将其写入服务器端存储库,其中包含此“会话”已结束的注释。

然后,有一个http模块,检查每个请求是否来自cookie的userdata部分的guid不指向已结束的会话。如果是,请终止请求,并发出警告:重复使用过期的cookie。

每次请求需要额外查找。

答案 1 :(得分:3)

  

有没有办法彻底销毁表单身份验证会话   注销,以便即使有人偷了cookie也会   没有机会恶意使用它

方法是在您的服务器上跟踪用户注销的时间和时间,因此即使它使用有效的经过身份验证的cookie查看页面,您也要仔细检查此用户是否也登录了您的服务器记录或不。

这意味着您必须在数据库上有一个额外的表来保留并检查用户状态的登录注销,而不是100%依赖于身份验证cookie。

  

有没有办法彻底销毁表单身份验证会话   注销时

在最糟糕的情况下,cookie被盗,你实际上不能。

为什么会这样,因为表单身份验证实际上是在cookie上保留所有数据(比如什么时候过期,谁是用户等)。所以你不能删除它,在cookie上,另一种方法是将它与服务器上的自定义数据同步,并具有额外的安全级别。

相关:Can some hacker steal the cookie from a user and login with that name on a web site?

答案 2 :(得分:1)

您可以轻松地使“早于日期X”的表单身份验证票证失效。

FormsAuthenticationTicket具有名为IssueDate的内置属性,您可以执行此操作。

例如,您可以执行以下操作:

  1. 将日期存储在用户的数据库记录中,您可以将其命名为ValidSince
  2. Application_AcquireRequestState(在global.asax中)中读取令牌日期
  3. 如果令牌的IssueDate早于数据库日期-请注销!

要使特定用户无效时,只需将数据库中的该日期重置为当前日期即可。

如果您需要一些实际的代码示例,我会在here上发布博客。

一个非常常见的用例是“使上一次更改密码之前创建的所有会话无效”。

答案 3 :(得分:0)

我实现了一个系统,该系统将SessionID存储在第一个经过身份验证的请求的auth cookie中,然后验证活动的SessionID是否与后续请求中的cookie匹配。 Details on this answer.这避免了@ WiktorZychla的答案中建议的服务器端跟踪。

这可以通过在会话和auth cookie中存储Incoming IP + Request.Browser + SessionID的哈希来改进,而不仅仅是SessionID。