这里需要注意的重要一点是,如果用户登录到站点http://example.com/,并且请求http://example.com/delete?id=1 删除了用户的帖子,那么以下代码将删除用户的帖子:
<script src="http://example.com/delete?id=1" />
这称为 CSRF/XSRF 攻击(跨站请求伪造)。这就是为什么大多数服务器端 Web 应用程序都需要交易票据的原因:您必须使用 http://example.com/delete?id=1 而不是 http://example.com/delete?id=1&txid=SomethingTheUserCannotGuess
现在下面的攻击不起作用了:
<script src="http://example.com/delete?id=1" />
...因为它不包含 txid 参数。现在,让我们考虑如果可以使用 XmlHttpRequest 访问该站点会发生什么。在用户浏览器上运行的脚本可以在用户背后检索和解析http://example.com/pageThatContainsDeleteLink,提取txid然后请求http://example.com/delete?id=1&txid=SomethingTheUserCannotGuess
现在,如果 XmlHttpRequest 无法访问具有不同来源的站点,尝试检索 txid 的唯一方法是尝试执行以下操作:
<script src="http://example.com/pageThatContainsDeleteLink" />
...但这无济于事,因为结果是 HTML 页面,而不是一段 JavaScript 代码。因此,您可以包含来自其他站点的<script>s 但不能通过 XmlHttpRequest 访问其他站点是有原因的。
您可能有兴趣阅读以下内容:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
这种攻击在过去曾针对 Gmail,并允许您从运行在另一个站点上的 JavaScript 代码中获取用户的邮件。这都说明WWW的安全模型很微妙,没有经过深思熟虑。它已经进化而不是精心设计。
至于您的问题:您似乎认为服务器http://example.com/ 是恶意服务器。事实并非如此。使用我的答案的符号,http://example.com/ 是作为攻击目标的服务器,http://attacker.com/ 是攻击者的站点。如果http://example.com/ 开启了使用 JSONP 或 CORS 发送请求的可能性,那么它确实可能容易受到我刚才描述的 CSRF/XSRF 攻击。但这并不意味着其他网站会容易受到攻击。同样,如果http://attacker.com/ 开启了使用 JSONP 或 CORS 发送请求的可能性,那么攻击者的站点就会容易受到 CSRF/XSRF 攻击。因此,被误导的服务器管理员可能会在他自己的站点中打开一个漏洞,但不会影响其他站点的安全。