18

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

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

有可能吗,还是我错过了什么?

4

2 回答 2

13

是的,这就是您需要做的所有事情。

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

这实现了同步器令牌模式,如OWASP的CSRF 预防备忘单中所述。

为了让脚本成功发出可接受的请求,它必须首先获取表单并读取令牌,然后发布令牌。同源策略将阻止在浏览器中允许这样做。一个站点不能向另一个站点发出 AJAX 样式的 http 请求;只对自己。如果由于某种原因可以违反同源策略,那么您将变得容易受到攻击。

注意,如果你有跨站脚本漏洞,那么攻击者可以滥用xss漏洞绕过同源策略提供的保护(因为脚本现在是从你自己的站点运行的,所以SOP成功了)。然后注入的脚本可以愉快地读取并重新提交令牌。这种通过 XSS 绕过 CSRF 保护的技术最近在一些蠕虫中很常见。基本上,如果你有 XSS,你的 CSRF 保护就是浪费时间,所以要确保你不会受到任何攻击。

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

在 OWASP阅读有关CSRF 的更多信息 另请参阅:XSS 预防备忘单

于 2009-11-26T13:41:37.840 回答
3

但是,如果恶意脚本会首先发出一些简单的 GET 请求(通过 AJAX)以下载隐藏输入字段中包含防伪令牌的页面,提取它并使用它来进行有效的 POST 怎么办?

是的,这是真的,但是,如果它没有出现在浏览器中,这不是 CSRF 攻击。

如果它确实结束了浏览器(例如通过服务器端代码中的 HTTP 请求进行抓取),那么抓取代码将获得 CSRF 令牌会发生什么。但是,您的合法、经过身份验证的用户将在他们的机器上获得不同的令牌。因为刮板提升的令牌与发布给您的用户的令牌不同,所以 POST 将失败。

如果您想阻止非浏览器脚本发布帖子,那么您需要采取另一种方法来验证它是不是人类。

于 2009-11-27T12:46:44.647 回答