我应该以所有形式使用 AntiForgeryToken,包括登录和注册吗?

信息安全 Web应用程序 应用安全 csrf asp.net-mvc
2021-08-09 04:56:32

我正在运行一个相当大的网站,每天有数千次访问,以及相当大的用户群。自从我开始迁移到 MVC 3 以来,我一直将 AntiForgeryToken 置于多种形式中,用于修改受保护的数据等。

其他一些形式,比如登录和注册现在也使用 AntiForgeryToken,但我开始怀疑他们的需求,原因有几个......

登录表单要求发布者知道正确的凭据。我真的想不出任何方式 CSRF 攻击会在这里受益,特别是如果我检查请求来自同一主机(检查 Referer 标头)。

每次加载页面时,AntiForgeryToken 令牌都会生成不同的值。如果我在登录页面打开了两个选项卡,然后尝试发布它们,第一个将成功加载。第二个将失败并出现 AntiForgeryTokenException(首先加载两个页面,然后尝试发布它们)。对于更安全的页面——这显然是一个必要的邪恶,对于登录页面——似乎有点矫枉过正,只是自找麻烦。

应该使用或不使用某种形式的令牌可能还有其他原因。我是否正确假设在每个帖子表单中使用令牌都是过大的,如果是这样 - 什么样的表单会从中受益,哪些肯定不会受益?

PS StackOverflow 上也有人问过这个问题,但我并不完全相信。我想我会在这里问它,以获得更多的安全保障

2个回答

是的,在登录页面中包含防伪令牌很重要。

为什么?因为“登录 CSRF”攻击的可能性。在登录 CSRF 攻击中,攻击者使用攻击者的帐户将受害者登录到目标站点。例如,考虑一个邪恶的攻击者 Evelyn 对 Paypal 用户 Alice 的攻击。如果 Paypal 没有保护其登录页面免受 CSRF 攻击(例如,使用防伪令牌),那么攻击者可以静默地将 Alice 的浏览器登录到 Evelyn 在 Paypal 上的帐户。Alice 被带到 Paypal 网站,Alice 已登录,但以 Evelyn 身份登录。假设 Alice 然后单击该页面以将她的信用卡链接到她的 Paypal 帐户,并输入她的信用卡号。Alice 认为她正在将她的信用卡与她的 Paypal 帐户相关联,但实际上她已将其与 Evelyn 的帐户相关联。现在伊芙琳可以买东西了 并将其记入爱丽丝的信用卡。哎呀。这很微妙而且有点晦涩,但足够严重,您应该为用于登录的表单操作目标包含防伪令牌。请参阅本文了解更多详细信息以及此类漏洞的一些真实示例。

什么时候可以取消防伪令牌?一般来说,如果目标是一个 URL,并且访问该 URL 没有副作用,那么您不需要在该 URL 中包含防伪令牌。

粗略的经验法则是:在所有 POST 请求中包含防伪令牌,但 GET 请求不需要它。然而,这个粗略的经验法则是一个非常粗略的近似值。它假设 GET 请求都没有副作用。在精心设计的 Web 应用程序中,希望是这样,但在实践中,有时 Web 应用程序设计人员不遵循该准则并实现具有副作用的 GET 处理程序(这是一个坏主意,但并不少见) . 这就是为什么我建议基于请求是否会对 Web 应用程序的状态产生副作用而不是基于 GET 与 POST 的指南。

当您需要防止某人使用特定凭据恶意将您登录到站点时,可能需要在登录页面上放置令牌。如果有人因需要以特定用户登录的事情而被陷害,我可以看到这种情况。话虽如此,它有点人为的例子。