使用AntiForgeryToken要求每个请求都传递有效令牌,因此使用简单脚本向我的Web应用程序发布数据的恶意网页将无法成功.
但是,如果恶意脚本首先发出一些简单的GET请求(通过Ajax),以便在隐藏的输入字段中下载包含防伪令牌的页面,将其解压缩并使用它来制作有效的POST,该怎么办?
有可能,还是我错过了什么?
是的,这就是你需要做的.
只要您在每个受保护的页面上生成新令牌,并使用,<%= Html.AntiForgeryToken() %>
并始终确保在任何受保护的操作中检查它[ValidateAntiForgeryToken]
这实现了在OWASP 的CSRF预防备忘单中讨论的同步器令牌模式.
为了使脚本能够成功地发出可接受的请求,它必须首先获取表单并读取令牌然后发布令牌.同源策略将阻止在浏览器中允许此操作.站点canot向另一个站点发出AJAX样式的http请求; 只对自己.如果出于某种原因可以违反相同的原产地政策,那么您将变得脆弱.
请注意,如果您有跨站点脚本漏洞,则攻击者可以滥用xss漏洞来规避同一源策略提供的保护(因为脚本现在从您自己的站点运行,因此SOP成功).然后,注入的脚本可以愉快地读取并重新提交令牌.这种通过XSS获得CSRF保护的技术最近在一些蠕虫中很常见.基本上,如果您有XSS,那么您的CSRF保护是浪费时间,因此请确保您不会受到任何影响.
另外需要注意的是Flash和Silverlight.这两种技术都不订阅相同的源策略,而是使用跨域策略文件来限制对远程资源的访问.如果您在自己的站点上发布跨域策略xml文件,则Flash/Silverlight脚本只能访问您站点上的资源.如果您确实发布了此文件,则只允许受信任的第三方服务器的白名单,并且永远不允许*.
在OWASP上阅读有关CSRF的更多信息, 请参阅:XSS预防备忘单