26

UPD:在security.stackexchange.com上提出了同样的问题,我得到的答案不同。请关注那里,以获得正确答案!

我正在运行一个相当大的网站,每天有数千次访问,以及相当大的用户群。

自从我开始迁移到 MVC 3 以来,我一直将 AntiForgeryToken 置于多种形式中,用于修改受保护的数据等。

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

  1. 登录表单要求发布者知道正确的凭据。我真的想不出 csrf 攻击会从中受益的任何方式。特别是如果我检查请求是否来自同一主机(检查引荐来源标头)
  2. 每次加载页面时,AntiForgeryToken 令牌都会生成不同的值。如果我在登录页面打开了两个选项卡,然后尝试发布它们,第一个将成功加载。第二个将失败并出现 AntiForgeryTokenException(首先加载两个页面,然后尝试发布它们)。使用更安全的页面 - 这显然是一个必要的邪恶,对于登录页面 - 似乎有点矫枉过正,只是自找麻烦:S

可能还有其他原因导致人们在他们的表单中使用/不使用令牌。我是否正确假设在每个帖子表单中使用令牌都是不好的/矫枉过正的,如果是这样 - 什么样的表单会从中受益,哪些肯定不会受益?

4

1 回答 1

13

防伪令牌在用户尚未通过身份验证的站点的公共部分(例如登录和注册表单)中是无用的。CSRF 攻击的工作方式如下:

  1. 恶意用户在他的站点上设置了一个类似于您的站点的 HTML 表单。此表单也可以包含隐藏字段。
  2. 他欺骗您的一位网站用户访问他的恶意网址。
  3. 用户认为他在您的网站上,填写表格并将其提交到您的网站。
  4. 如果用户已经在您的站点上通过身份验证,则表单提交成功并且毫无戒心的用户已经删除了他的帐户(或任何您能想象的)。

因此,您可以在站点的经过身份验证的部分使用防伪令牌,其中包含可以以某种方式修改用户状态的操作。

备注:检查 Referer 标头以识别来自您的站点的请求是不安全的。任何人都可以伪造请求并欺骗此标头。

于 2011-01-21T18:44:23.967 回答