ASP.NET MVC3的AntiForgeryToken有哪些实现细节和基本原理?

时间:2011-02-06 19:06:12

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

AntiForgeryToken用于防止CSRF攻击,但是MSDN上的链接并没有让我深入了解AntiForgeryToken究竟做了什么,或者它是如何工作的,或者为什么事情都按照它们的方式完成。

从我收集的内容中,它在网页和cookie中创建了一个哈希。其中一个或两个使用散列IPrincipal.Name,并使用对称加密。

任何人都可以解释:

  1. AntiForgeryToken如何在内部运作
  2. 应该用什么来保护
  3. 不应该用什么来保护
  4. 上面#1的实施选择背后的原因是什么?
    • 实施例:
      • 是“DoubleSubmit”cookie和其他常见漏洞的实施安全
      • 如果用户打开多个标签
      • ,是否存在实施问题
      • 是什么让MSFT的实现与SANS提供的实现不同

1 个答案:

答案 0 :(得分:1)

好的,这是我最好的拍摄。

1)在内部,mvc使用RNG加密方法创建一个128位字符串作为XSRF令牌。此字符串存储在cookie中以及表单上某处的隐藏字段中。 cookie名称似乎是__RequestVerificationToken +应用程序路径(服务器端)的基本64编码版本的形式。其中的html部分使用AntiForgeryDataSerializer来序列化以下数据    - 盐     - 值(标记字符串)     - 创建日期的刻度     - 用户名(看起来像Context.User)

validate方法基本上反序列化了cookie和表单中的值,并根据值(salt / value / ticks / username)对它们进行比较。

2/3)我认为这个讨论更多的是关于何时使用XSRF令牌以及何时不使用XSRF令牌。在我看来,你应该在每个表格上使用它(我的意思是为什么不)。我唯一可以想到的是,如果您确实遇到了问题,那么这是不能保护的。知道应用名称的base64编码将允许攻击者能够在XSRF攻击期间查看cookie。也许我对此的解释是不正确的。

4)不确定你到底在找什么?我想我会建立一种机制,我会尝试在会话中存储XSRF令牌(如果已经可用),如果没有,那么尝试cookie方法。至于使用的加密类型,我发现了这个SO artcile。 Pros and cons of RNGCryptoServiceProvider