何时不需要/不需要使用AntiForgeryToken?

时间:2011-01-21 10:49:18

标签: asp.net-mvc-3 csrf antiforgerytoken

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

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

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

其他一些表格,比如登录/注册现在也使用AntiForgeryToken,但我首先对它们的需求感到怀疑,原因有两个......

  1. 登录表单要求海报知道正确的凭据。我真的无法想到csrf攻击会在这里受益。特别是如果我检查请求来自同一主机(检查Referrer标头)
  2. 每次加载页面时,AntiForgeryToken令牌都会生成不同的值。如果我有两个选项卡打开登录页面,然后尝试发布它们,第一个将成功加载。第二个将失败并出现AntiForgeryTokenException(首先加载两个页面,然后尝试发布它们)。有了更安全的页面 - 这显然是一个必要的恶魔,登录页面 - 看起来有点过分,只是在寻找麻烦:S
  3. 为什么会在表格中使用/不使用令牌可能还有其他原因。我是否认为在每个帖子表格中使用令牌都是错误的/过度杀伤,如果是这样的话,我会采取什么样的表格会受益从它,哪些肯定不会受益?

1 个答案:

答案 0 :(得分:11)

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

  1. 恶意用户在其网站上设置类似于您网站的HTML表单。此表单也可能包含隐藏字段。
  2. 他欺骗您的一位网站用户访问他的恶意网址。
  3. 用户认为他在您的网站上,填写表单并将其提交到您的网站。
  4. 如果用户已在您的网站上进行了身份验证,则表单提交成功,并且毫无戒心的用户已删除了他的帐户(或您可以想象的任何内容)。
  5. 因此,您可以在网站的经过身份验证的部分使用反伪造令牌,其中包含可能以某种方式修改用户状态的操作。

    备注:检查Referer标头以确定来自您网站的请求不安全。任何人都可以伪造请求并欺骗此标题。