【问题标题】:What are the implementation details and rationale of ASP.NET MVC3's AntiForgeryToken?ASP.NET MVC3 的 AntiForgeryToken 的实现细节和原理是什么?
【发布时间】:2011-06-22 08:58:21
【问题描述】:

AntiForgeryToken 用于防止 CSRF 攻击,但是 MSDN 上的链接并没有让我深入了解 AntiForgeryToken 的确切作用,或者它是如何工作的,或者为什么事情会以这种方式完成。

据我所知,它在网页和 cookie 中创建了一个哈希值。其中一个或两个都使用散列的IPrincipal.Name,并使用对称加密。

任何人都可以阐明:

  1. AntiForgeryToken 如何在内部工作
  2. 应该用什么来保护
  3. 不应该用它来保护什么
  4. 上述#1 的实施选择背后的原因是什么?
    • 示例:
      • 实施可以避免“DoubleSubmit”cookie 和其他常见漏洞
      • 如果用户打开多个选项卡,是否存在实施问题
      • 是什么让 MSFT 的实施与 SANS 的实施不同

【问题讨论】:

  • 你想知道什么是 CSRF 吗?具体是如何处理的?或者只是一般情况下你会如何处理它?
  • @CtrlDot - 我想了解 MSFT 实施背后的所有细节。我可以去security.stackexchange.com 获取有关 CSRF 的大量信息并重复提交 cookie

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


【解决方案1】:

好的,这是我最好的镜头。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多