为什么跨域Ajax是一个安全问题?
为什么决定使用XMLHTTPRequest进行XML调用不应该跨域边界调用?您可以检索JavaScript,图片,CSS,iframe,以及我可以从其他域中想到的任何其他内容。为什么Ajax HTTP请求不允许跨域边界?看起来像一个奇怪的限制,考虑到我可以看到它被滥用的唯一方式,将是如果有人在页面中注入Javascript。但是,在这种情况下,您可以简单地向文档中添加一个img,脚本或iframe元素,以使其请求第三方URL并将其发送到服务器。
[编辑] 一些答案指出了以下原因,让我们指出他们没有创造一个主要理由不允许这一点的原因。 XSRF(跨站点请求伪造,也称为CSRF,XSRF) 你可以做XSRF攻击,而不使用这一切。作为一般规则,XMLHTTPRequest根本不使用,只是因为它很难使XMLHTTPRequest以一种兼容所有主流浏览器的方式。如果您希望他们加载您的网址,只需在网址中添加一个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:为什么你会把这个漏洞留在一个新的功能 你不再创造更多的不安全感。你只是不方便的开发者想要使用它在某种方式为好。任何人谁想要使用这个功能的邪恶(aka真棒)可以使用一些其他的方法。 结论 我把bobince的答案标记为正确,因为他指出了关键问题。由于XMLHTTPRequest允许您使用凭证(Cookie)发布到目标网站,并读取从网站发回的数据,以及发送个人凭据,您可以编排一些javascript,将提交一系列表单,包括确认表单,完成随机生成的任何随机密钥,以防止XSRF。通过这种方式,您可以浏览目标网站(如银行),银行的网络服务器无法确定它不只是提交所有这些表单的普通用户。
因为AJAX请求是(a)使用用户凭证提交的,并且(b)允许调用者读取返回的数据。 这是可能导致漏洞的这些因素的组合。有一些建议要添加一种省略用户凭据的跨域AJAX形式。
这些方法都不允许调用者读取返回的数据。 (除了为了允许跨域脚本而有意设置允许的脚本或者有人做了可怕的启动的脚本)。
这不是XSS攻击。这是一个跨站点请求伪造攻击(XSRF)。有已知的解决XSRF攻击的方法,例如包括一次性或加密令牌以验证提交是从用户故意地并且不是从攻击者代码启动。 如果你允许跨域AJAX,你会失去这个保护。攻击代码可以从银行网站请求一个页面,读取其上的任何授权令牌,并在第二个AJAX请求中提交它们以执行传输。这将是一个跨站点脚本攻击。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |