根据我的研究,防止这种情况的正确方法是在每个返回表单的GET请求中设置NONCE,然后在POST请求中检查NONCE。但是,有人仍然可以编写一个脚本来与NONCE一起获取我的表单,然后将其与NONCE一起发回。
由于这是一个众所周知的漏洞,浏览器是否应该通过不允许跨域ajax调用来解决这个问题?如果没有,ASP.NET MVC 4是否已经有内置机制来防范这种情况?
答案 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()。 然后,运行时将执行以下步骤:
如果当前HTTP请求已包含反XSRF会话 令牌(反XSRF cookie __RequestVerificationToken),安全性 令牌从中提取出来。如果HTTP请求不包含 反XSRF会话令牌或安全令牌的提取失败, 将生成新的随机反XSRF令牌。
反XSRF字段 令牌是使用上面步骤(1)中的安全令牌生成的 当前登录用户的身份。
- 醇>
如果是新的反XSRF 在步骤(1)中生成令牌,将创建新的会话令牌 包含它并将添加到出站HTTP cookie 采集。步骤(2)中的字段标记将包装在一个元素中,此HTML标记将是返回 Html.AntiForgeryToken()或AntiForgery.GetHtml()的值。
读:
答案 2 :(得分:1)
您还应该了解无状态CSRF保护的概念。实现此目的有两种标准方法:加密令牌模式和双提交Cookie模式。 The Encrypted Token Pattern利用Rijndael加密的令牌,该令牌包含脚本无法读取的内置随机数值,并且是一种非常强大的加密结构。