【问题标题】:Do I have to protect against cross domain request forgery?我是否必须防止跨域请求伪造?
【发布时间】:2013-12-23 00:46:35
【问题描述】:

根据我的研究,防止这种情况的正确方法是为每个返回表单的 GET 请求设置一个 NONCE,然后检查 POST 请求上的 NONCE。但是,仍然有人可以编写一个脚本来获取我的表单以及 NONCE,然后将它与 NONCE 一起发布回来。

既然这是一个广为人知的漏洞,浏览器不应该通过不允许跨域 ajax 调用来解决这个问题吗?如果没有,ASP.NET MVC 4 是否已经有内置机制来防止这种情况发生?

【问题讨论】:

    标签: asp.net asp.net-mvc cross-domain nonce


    【解决方案1】:

    这些随机数用于防止跨站点请求伪造。不需要跨域 ajax 调用来实现这一点 - 浏览器确实有针对这些的保护。 CSRF 是一个漏洞,因为当浏览器调用您的站点时,它会发送您站点的会话信息,而不管告诉浏览器进行调用的页面是什么。通过在 evilsite.com 上包含一个指向您 site.com 上的页面的 img 标签,可以告诉浏览器向您的 site.com 发出 get 请求。如果您在 yoursite.com 处理该获取请求时验证了 nonce,则 evilsite.com 的驱动器将无法知道 nonce。也可以对发布请求执行类似的操作。

    这个页面似乎有一些关于如何在 ASP.NET MVC 中缓解这种情况的信息:http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages

    干杯, 斯蒂芬

    【讨论】:

    • GET 请求不应该是一个问题,因为您永远不应该使用 GET 请求执行敏感任务。 POST 请求是我所关心的。如果攻击者仍然可以让浏览器发出 GET 请求、获取 NONCE 然后 POST 包含 NONCE 的表单,那么 NONCE 将如何保护我?
    • 因为在执行get的时候(再次,作为图片标签或类似的东西)页面的内容实际上并不能被调用页面访问,所以邪恶页面没有办法获取在nonce。
    • 如果我通过<img> 标记发出 GET 请求则不会,但我可以使用 AJAX 和 JSONP 发出 GET 请求。
    • 虽然他们不应该这样做,但他们经常这样做。例如,您的注销页面是通过 get 还是 post 访问的?您是否希望您的用户通过访问论坛或其他攻击者可能能够控制 html 的网站退出您的网站?
    • 这就是浏览器保护的用武之地。除非您在网络服务器上启用了跨域请求,否则您应该受到保护。
    【解决方案2】:

    是的,有一个内置机制。 HtmlHelper.AntiForgeryToken,可用于帮助保护您的应用程序免受跨站点请求伪造。要使用此功能,请从表单中调用 AntiForgeryToken 方法并将ValidateAntiForgeryTokenAttribute 属性添加到您要保护的操作方法中。

    CSHTML 文件:

    @Html.AntiForgeryToken()
    

    控制器:

    [ValidateAntiForgeryToken]
    public ActionResult Edit(User updatedUser)
    

    您会注意到,令牌涉及两个安全措施——一个表单字段和一个 cookie:

    要生成反 XSRF 令牌,请调用 @Html.AntiForgeryToken() 来自 MVC 视图的方法或来自 Razor 页面的 @AntiForgery.GetHtml()。 然后运行时将执行以下步骤:

    1. 如果当前的 HTTP 请求已经包含一个反 XSRF 会话 令牌(anti-XSRF cookie __RequestVerificationToken),安全性 令牌从中提取。如果 HTTP 请求不包含 反 XSRF 会话令牌,或者如果提取安全令牌失败, 将生成一个新的随机反 XSRF 令牌。

    2. 一个反 XSRF 字段 令牌是使用上述步骤 (1) 中的安全令牌生成的,并且 当前登录用户的身份。

    3. 如果一个新的反 XSRF 在步骤(1)中生成了令牌,将创建一个新的会话令牌 包含它并将添加到出站 HTTP cookie 收藏。步骤 (2) 中的字段标记将包装在一个元素中,此 HTML 标记将作为返回 Html.AntiForgeryToken() 或 AntiForgery.GetHtml() 的值。

    阅读:

    XSRF/CSRF Prevention

    Wikipedia CSRF

    【讨论】:

    • 感谢您的指导。但是,附带说明一下,如果攻击者仍然可以让浏览器发出 GET 请求、获取 NONCE 然后 POST 包含 NONCE 的表单,那么 NONCE 将如何保护我?
    • @YasmaniLlanes 你认为他们是怎么做到的?听起来攻击者正坐在用户的计算机前。
    • 他们可以使用 JavaScript 为浏览器提供页面。
    • 不,他们不能:en.wikipedia.org/wiki/Same-origin_policy 除非您允许他们使用 CORS
    • @YasmaniLlanes 如果您阅读 StefanH 的答案中的链接,您会发现 AntiForgeryToken 不仅包含表单字段,还包含 cookie。攻击者将无法伪造或读取属于您域的 cookie。
    【解决方案3】:

    您还应该看看无状态 CSRF 保护的概念。有两种标准方法可以实现这一点:加密令牌模式和双重提交 Cookie 模式。 The Encrypted Token Pattern 使用 Rijndael 加密的 Token,其中包含脚本无法读取的内置 nonce 值,是一种非常强大的加密结构。

    【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2019-05-26
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2020-08-25
    • 2011-05-17
    相关资源
    最近更新 更多