一尘不染

ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻击?

ajax

使用AntiForgeryToken要求每个请求都传递一个有效的令牌,因此带有简单脚本将数据发布到我的Web应用程序的恶意网页将不会成功。

但是,如果恶意脚本首先发出一个简单的GET请求(由Ajax发出),以便在隐藏的输入字段中下载包含防伪令牌的页面,然后将其提取出来并用于进行有效的POST,该怎么办?

是否有可能,或者我缺少什么?


阅读 300

收藏
2020-07-26

共1个答案

一尘不染

是的,这就是您需要做的。

只要您在每个受保护的页面上生成一个新令牌,<%= Html.AntiForgeryToken() %>
并始终使用[ValidateAntiForgeryToken]

这实现了OWASP 的CSRF预防备忘单中讨论的同步器令牌模式。

为了使脚本成功发出可接受的请求,它必须首先获取表单并读取令牌,然后发布令牌。相同来源策略将阻止在浏览器中允许此操作。一个站点向另一个站点发出AJAX样式的http请求;只对自己。如果出于某种原因可以违反同一来源政策,那么您将变得脆弱。

请注意,如果您具有跨站点脚本漏洞,则攻击者可以滥用xss漏洞来规避同一原始策略提供的保护(因为该脚本现在从您自己的站点运行,因此SOP成功了)。然后,注入的脚本可以愉快地读取并重新提交令牌。通过XSS克服CSRF保护的这种技术最近在某些蠕虫中很常见。基本上,如果您具有XSS,那么保护CSRF就是浪费时间,因此请确保您都不容易受到这两种攻击。

需要注意的另一件事是Flash和Silverlight。这两种技术都不订阅相同的原始策略,而是使用跨域策略文件来限制对远程资源的访问。如果您在自己的站点上发布跨域策略xml文件,则Flash
/ Silverlight脚本只能访问站点上的资源。如果您确实发布了此文件,则永远只允许将受信任的第三方服务器列入白名单,而永远不允许*。

在OWASP上了解有关CSRF的更多信息
另请参见:XSS预防备忘单

2020-07-26