ajax - 为什么跨域Ajax是一个安全问题?

标签 ajax security xss

为什么决定使用 XMLHTTPRequest 进行 XML 调用不应该跨域边界进行调用?您可以从其他域检索 JavaScript、图像、CSS、iframe 以及我能想到的任何其他内容。为什么 Ajax HTTP 请求不允许跨域边界?考虑到我能看到它被滥用的唯一方式就是有人将 JavaScript 注入(inject)到页面中,这似乎是一个奇怪的限制。但是,在这种情况下,您可以简单地将 img、script 或 iframe 元素添加到文档中,以使其请求第三方 URL 并将其发送到服务器。

[编辑]

一些答案​​指出了以下原因,让我们指出他们没有构成禁止这样做的主要原因的原因。

XSRF(跨站请求伪造,也称为 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 来提交一系列表单,包括确认表单,包含生成的任何随 secret 钥,这些随 secret 钥是为了防止 XSRF 而放置的。通过这种方式,您可以浏览目标网站,例如银行,而银行的网络服务器将无法判断这不仅仅是提交所有这些表单的普通用户。

最佳答案

Why are Ajax HTTP Requests not allowed to cross domain boundaries.

因为 AJAX 请求 (a) 使用用户凭据提交,并且 (b) 允许调用者读取返回的数据。

这些因素的结合可能会导致漏洞。有人建议添加一种省略用户凭据的跨域 AJAX 形式。

you could simply add an img, script, or iframe element to the document

这些方法都不允许调用者读取返回的数据。

(除非是故意设置为允许这样做的脚本,以允许跨域脚本编写 - 或者有人犯了一个可怕的错误。)

Your can do XSS attacks without using this at all. Posting to third party site

这不是 XSS 攻击。这是跨站点请求伪造攻击 (XSRF)。有一些已知的方法可以解决 XSRF 攻击,例如包含一次性或加密 token 来验证提交是否是故意来自用户而不是从攻击者代码启动。

如果您允许跨域 AJAX,您将失去这种保护措施。攻击代码可以从银行站点请求页面,读取该页面上的任何授权 token ,然后在第二个 AJAX 请求中提交它们以执行转账。这将是跨站点脚本攻击。

关于ajax - 为什么跨域Ajax是一个安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466737/

相关文章:

ajax - 在grails Controller 中解析ajax多个文件上传

security - Azure安全性的优点和缺点

Django ImageField/FileField 自定义upload_to 功能,以及安全性

php - CodeIgniter 输入过滤

php - 如何防止我的网站受到 XSS 注入(inject)?

javascript - 这个用户试图破解什么,这可能吗?

javascript - 如何使用 ajax 在文件中加载特定的 div/class?

javascript - 客户端没有收到来自 Servlet 的响应

javascript - jQuery 未捕获类型错误 : Cannot read property 'text' of null

security - 修改SVN密码命令行