【问题标题】:Using the MVC3 AntiForgeryToken in non-authenticated scenarios?在非认证场景中使用 MVC3 AntiForgeryToken?
【发布时间】:2012-01-31 21:45:47
【问题描述】:

通过several threads,我可以看到,在用户未通过身份验证的站点区域使用 MVC 防伪令牌是多余的。

我有一个应用程序,它从 site1、site2、site3 等向 mysite.com 发布一些信息。每个站点都有一个唯一标识符,该标识符通过异步 Javascript POST 在 POST 请求中发送。在 site1-3 上执行的 Javascript 在 mysite.com 上生成,然后返回到填充了一些 Javascript 变量的站点。

所以生命周期如下:

  1. site1 上的页面有对 mysite.com 的 Javascript 引用。
  2. 该链接引用指向一个控制器路由,该路由生成 Javascript 以返回到 site1。
  3. 返回的 JS 末尾包含一个 POST 请求,该请求返回到 mysite.com,其中包含 URL、浏览器等,以及 site1 上页面访问者的详细信息。

我可以从 JS POST 请求的接受控制器中很好地读取 POST 参数,但是,我想知道是否有任何意义将防伪令牌添加到参数列表中。

如果是这样,我将不得不在初始请求中生成它,并在返回到 site1 的 JS 中将其作为 JS 变量传回,然后在第二个请求中将其与表单 POST 一起传回。

由于只有在找到有效帐户的情况下才会在 mysite.com 上进行任何处理,所以这样做有什么意义吗?

如果是这样,我将如何在控制器级别生成防伪令牌?

【问题讨论】:

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


    【解决方案1】:

    我会说这取决于发布的数据的敏感性。如果另一个用户可以通过伪造请求并提交它们来造成伤害(或烦恼),那么我会说这是合适的。听起来您只是在收集一些使用信息,所以不太可能是这种情况。

    一次性随机随机数可能是更好的解决方案。这将使伪造请求和防止错误的多次提交变得困难,例如来自使用缓存副本的用户。在 mysite.com 上生成一个随机值(GUID 可能有效),将其插入数据库并将其标记为未使用。将其与 POST 一起发回。检查它是否已被使用。如果未使用,则将其标记为已使用并执行您的日志记录操作。如果已被使用,则将该请求作为重复提交丢弃。

    请注意,您不需要 POST,带有 URL 参数的简单 GET 就足够了,因为 nonce 将防止它被意外重复。

    【讨论】:

    • 我实际上已经在做这样的事情了。每个请求都会创建两个新的 GUID。第一个 GUID 是指用户 - 并在客户端读取 cookie。如果该访问者的 GUID 已经存在于我的数据库中,那么我将使用它们的值。如果没有,请设置 cookie 并将其添加到数据库中。第二个 GUID 用于跟踪他们的会话(3 分钟后到期)。我想知道这两者的结合是否足够,或者按照您的建议进行,在这种情况下,创建第三个 GUID 作为请求验证器(如果我没记错的话)?
    • 我并不是说它是绝对必要的,但它确实填补了一个可能会意外重复请求的漏洞,并且也使得伪造请求变得更加困难。您的两个 GUID 都没有这样做。成功的攻击者可以在 3 分钟内使用截获的用户/会话 GUID 提交数千个请求。您必须权衡发生这种情况的风险与添加额外的一次性随机数的复杂性。
    • 有道理。我将添加这种方法,并喜欢使用/未使用的概念。谢谢。
    • 如果我们内置了一次性令牌。我认为是时候将其添加到mvcsecurity.codeplex.com
    • @AdamTuliper - 那真的很好。我现在正在考虑实现,我预见的问题是我的 RequestToken 表会变得非常大,因为每个请求都会有一个包含 GUID 的条目。您认为清空表格是安全的?让它填充 100,000 行过期的请求令牌?
    猜你喜欢
    • 2011-10-07
    • 2014-11-11
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2011-11-06
    • 2011-12-09
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多