为什么决定使用XMLHTTPRequest进行XML调用不应该跨域边界调用?您可以检索JavaScript,图片,CSS,iframe以及我能从其他域中想到的任何其他内容.为什么不允许Ajax HTTP请求跨越域边界?考虑到我可以看到它被滥用的唯一方式,这似乎是一个奇怪的限制,如果有人将Javascript注入页面.但是,在这种情况下,您只需向文档中添加img,script或iframe元素,即可让它请求第三方URL并将其发送到服务器.
[编辑]
一些答案指出了以下原因,让我们指出他们没有创造禁止这一点的主要原因的原因.
你可以在不使用它的情况下进行XSRF攻击.作为一般规则,XMLHTTPRequest根本不被使用,仅仅是因为以与所有主流浏览器兼容的方式制作XMLHTTPRequest非常困难.如果您希望它们加载您的URL,则可以更轻松地向网址添加img标记.
<script type="text/javascript">
$.post("http://some-bank.com/transfer-money.php",
{ amount: "10000", to_account: "xxxx" })
</script>
Run Code Online (Sandbox Code Playgroud)
可以完成
<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>
Run Code Online (Sandbox Code Playgroud)
你不会再造成任何不安全感.您只是想要以良好的方式使用它的开发人员感到不安.任何想要将此功能用于邪恶(也称为真棒)的人都可以使用其他方法来实现它.
我将bobince的答案标记为正确,因为他指出了关键问题.因为XMLHTTPRequest允许您使用凭据(cookie)发布到目标站点,并读取从站点发回的数据,以及发送人员凭据,您可以编排一些提交一系列表单的JavaScript,包括确认表单,完成生成的任何随机密钥,以防止XSRF.通过这种方式,您可以浏览目标网站,如银行,银行的网络服务器将无法确定是否只是提交所有这些表单的普通用户.
默认情况下,浏览器不允许跨站点AJAX请求.
我知道,一个设想不当的跨域请求可能会带来安全风险.如果我使用外部网站的html或javascript并将其"渲染"到我的网站,那就是一个问题.该外部代码可用于许多不良事情 - 例如访问当前用户的会话数据.
但是,如果我只请求JSON或XML数据,并且我使用适当的库来解析JSON(而不仅仅是使用eval),我无法想象这将是一个安全风险.可能发生的更糟糕的是来自该站点的内容无法正确呈现.
我错过了什么吗?是否可以通过发送某种恶意数据来破坏读取json/xml的页面?