为什么决定使用XMLHTTPRequest进行 XML 调用不应该跨域边界进行调用?您可以从其他域检索 JavaScript、图像、CSS、iframe 以及我能想到的任何其他内容。为什么不允许 Ajax HTTP 请求跨越域边界?考虑到我可以看到它被滥用的唯一方式,这似乎是一个奇怪的限制,那就是如果有人将 Javascript 注入页面。但是,在这种情况下,您可以简单地将 img、script 或 iframe 元素添加到文档中,以使其请求第三方 URL 并将其发送到服务器。
[编辑]
一些答案指出了以下原因,让我们指出他们没有造成不允许这样做的主要原因的原因。
XSRF(Cross Site Request Forgery,又称CSRF、XSRF)
你可以在不使用它的情况下进行 XSRF 攻击。作为一般规则,根本不使用 XMLHTTPRequest,只是因为很难以与所有主流浏览器兼容的方式生成 XMLHTTPRequest。如果您希望他们加载您的 URL,只需向 URL 添加一个 img 标记会容易得多。
发布到第三方网站
<script type="text/javascript">
$.post("http://some-bank.com/transfer-money.php",
{ amount: "10000", to_account: "xxxx" })
</script>
可以用
<body onload="document.getElementById('InvisbleForm').submit()"
<div style="display:none">
<form id="InvisbleForm" action="http://some-bank.com/transfer-money.php" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="to_account" value="xxxxx">
</form>
</div>
</body>
JPunyon:为什么要把漏洞留在新功能中
你不会再制造任何不安全感。您只是给想要以某种方式使用它的开发人员带来不便。任何想要将此功能用于邪恶(又名真棒)的人都可以使用其他方法来做到这一点。
结论
我将bobince的答案标记为正确,因为他指出了关键问题。因为 XMLHTTPRequest 允许您使用凭据(cookie)发布到目标站点,并读取从站点发回的数据,以及发送人员凭据,所以您可以编排一些 javascript 来提交一系列表单,包括确认表单, 以及生成的任何随机密钥,这些密钥被放置在适当的位置以防止 XSRF。这样,您可以像银行一样浏览目标站点,而银行的网络服务器将无法判断提交所有这些表单的不仅仅是普通用户。