根据我的研究,防止这种情况的正确方法是为每个返回表单的GET请求设置一个NONCE,然后在POST请求上检查NONCE。然而,有些人仍然可以编写一个脚本来获取我的表单和NONCE,然后用NONCE将其发布回来。
既然这是一个众所周知的漏洞,浏览器难道不应该通过不允许跨域ajax调用来解决这个问题吗?如果没有,ASP.NET MVC 4是否已经有了一个内置机制来防止这种情况的发生?
这些nonce用于防止跨站点请求伪造。实现这一点不需要跨域ajax调用,浏览器也有相应的保护措施。CSRF是一个漏洞,因为当浏览器呼叫您的网站时,它会发送您网站的会话信息,而不管是哪个页面通知浏览器进行呼叫。浏览器可以通过在evivisite.com上包含指向您网站上某个页面的img标签来向您的网站发出获取请求。如果您的网站处理该获取请求时验证了nonce,则evivisitecom的驾车者不可能知道该nonce。类似的事情也可以用于发布请求。
这个页面似乎有一些关于如何在ASP.NetMVC中减轻这种情况的信息:http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages
干杯,Stefan
是的,有一个内置机制。HtmlHelper.AntiForgeryToken,可用于帮助保护您的应用程序免受跨站点请求伪造。要使用此功能,请从表单中调用AntiForgeryToken方法,并将ValidateAntiForgeryTakenAttribute属性添加到要保护的操作方法中。
CSHTML文件:
@Html.AntiForgeryToken()
控制器:
[ValidateAntiForgeryToken]
public ActionResult Edit(User updatedUser)
您会注意到,令牌涉及两个安全措施——一个表单字段和一个cookie:
要生成反XSRF令牌,请调用@Html.AntiForgeryToken()方法,或者Razor页面中的@AntiForgery.GetHtml()。运行时将执行以下步骤:
如果当前HTTP请求已包含反XSRF会话令牌(反XSRF cookie __RequestVerificationToken),安全从中提取令牌。如果HTTP请求不包含反XSRF会话令牌,或者如果安全令牌的提取失败,将生成新的随机反XSRF令牌。
反XSRF场使用来自上述步骤(1)的安全令牌生成令牌,并且当前登录用户的标识。
如果新的抗XSRF令牌是在步骤(1)中生成的,将创建一个新的会话令牌以包含它,并将添加到出站HTTP cookie中收集步骤(2)中的字段标记将被封装在一个元素中,该HTML标记将返回Html.AntiForgeryToken()或AntiForgery.GetHtml().的值
读数:
XSRF/CSRF预防
维基百科CSRF
您还应该了解无状态CSRF保护的概念。实现这一点有两种标准方法:加密令牌模式和双重提交Cookie模式。加密令牌模式利用Rijndael加密令牌,该令牌包含脚本无法读取的内置nonce值,并且是一个非常强大的加密结构。