7

有人问我关于 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 cookie,这样任何人都无法以编程方式拦截或更改此 cookie。

因此,即使上述预防措施被打破(我们认为这种可能性很小),恶意用户也只有 15 分钟的时间来打破预防措施并成功登录

4

4 回答 4

5

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

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

这会带来每个请求的额外查找成本。

于 2013-04-17T16:01:21.363 回答
3

有没有办法在注销时完全销毁表单身份验证会话,这样即使有人窃取了 cookie,也没有机会恶意使用它

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

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

有没有办法在注销时完全销毁表单身份验证会话

在 cookie 被盗的最坏情况下,您实际上不能。

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

相关:一些黑客可以从用户那里窃取 cookie 并在网站上使用该名称登录吗?

于 2013-04-17T14:38:37.860 回答
1

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

AFormsAuthenticationTicket有一个名为的内置属性IssueDate,可让您执行此操作。

例如,您可以这样做:

  1. 在用户的数据库记录中存储一个日期,你可以命名它ValidSince
  2. 读取里面的令牌日期Application_AcquireRequestState(在 global.asax 中)
  3. 如果令牌的IssueDate日期早于数据库日期 - 注销!

当您想使特定用户无效时 - 只需将数据库中的该日期重置为当前日期。

如果您需要一些实际的代码示例,我在这里写了博客。

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

于 2019-07-07T19:26:48.110 回答
0

我实现了一个系统,该系统在第一个经过身份验证的请求上将 SessionID 存储在 auth cookie 中,然后验证活动 SessionID 与后续请求中的 cookie 匹配。 有关此答案的详细信息。 这避免了@WiktorZychla 的回答中建议的服务器端跟踪。

这可以通过在会话和身份验证 cookie 中存储传入 IP + Request.Browser + SessionID 的哈希值来改进,而不仅仅是 SessionID。

于 2018-02-19T21:54:28.703 回答