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