这里需要注意的重要一点是,如果用户登录到网站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>
来自其他站点但不通过 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 攻击。因此,信息错误的服务器管理员可能会在自己的站点中打开漏洞,但这不会影响其他站点的安全。
Edit:提出了有效的评论。它解释了以下代码:
<script src="http://example.com/delete?id=1" />
...发送 GET 请求,然后example.com
如果请求更改状态(例如删除重要内容),则应仅接受 POST 或 DELETE 请求。
确实如此,设计良好的站点不应根据任何 GET 请求更改状态。但是,这会发送一个 POST 请求:
<p>You just won $100! Click below to redeem your prize:</p>
<form action="http://example.com/delete" method="post">
<input type="hidden" name="id" value="1" />
<input type="submit" value="Redeem prize" />
</form>
在这种情况下,声称用户赢得 100 美元的代码可以嵌入到攻击者的站点中,并且它不会将 POST 请求发送到攻击者的站点,而是发送到受害者的站点。