我是否必须防止跨域请求伪造?

时间:2013-12-05 21:12:37

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

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

由于这是一个众所周知的漏洞,浏览器是否应该通过不允许跨域ajax调用来解决这个问题?如果没有,ASP.NET MVC 4是否已经有内置机制来防范这种情况?

3 个答案:

答案 0 :(得分:3)

这些nonce用于防止跨站点请求伪造。不需要跨域ajax调用来实现这一点 - 并且浏览器确实对这些进行了保护。 CSRF是一个漏洞,因为当浏览器调用您的站点时,它会发送您站点的会话信息,而不管告诉浏览器进行呼叫的页面。可以通过在evilsite.com上添加指向您的site.com上的页面的img标记,告知浏览器向您的site.com发出get请求。如果yoursite.com处理了get请求,您验证了nonce,则evilsite.com的驱动器无法知道nonce。对于帖子请求也可以做类似的事情。

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

干杯, 斯蒂芬

答案 1 :(得分: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会话   令牌(反XSRF cookie __RequestVerificationToken),安全性   令牌从中提取出来。如果HTTP请求不包含   反XSRF会话令牌或安全令牌的提取失败,   将生成新的随机反XSRF令牌。

  2.   
  3. 反XSRF字段   令牌是使用上面步骤(1)中的安全令牌生成的   当前登录用户的身份。

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

  6.   

读:

XSRF/CSRF Prevention

Wikipedia CSRF

答案 2 :(得分:1)

您还应该了解无状态CSRF保护的概念。实现此目的有两种标准方法:加密令牌模式和双提交Cookie模式。 The Encrypted Token Pattern利用Rijndael加密的令牌,该令牌包含脚本无法读取的内置随机数值,并且是一种非常强大的加密结构。