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

为什么跨域Ajax是一个安全问题?,ajax,security,xss,Ajax,Security,Xss,为什么决定使用XMLHTTPRequest进行XML调用不应跨域边界进行调用?您可以从其他域检索JavaScript、图像、CSS、iFrame以及我能想到的任何其他内容。为什么不允许Ajax HTTP请求跨越域边界?考虑到我能看到它被滥用的唯一方式,这似乎是一个奇怪的限制,如果有人将Javascript注入页面。但是,在这种情况下,您可以简单地向文档中添加img、script或iframe元素,使其请求第三方URL并将其发送到服务器 [编辑] 一些答案指出了以下原因,让我们指出他们没有创造一个

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

[编辑]

一些答案指出了以下原因,让我们指出他们没有创造一个主要理由来拒绝这一点的原因

XSRF(跨站点请求伪造,也称为CSRF,XSRF) 您可以在根本不使用它的情况下进行XSRF攻击。一般来说,根本不使用XMLHTTPRequest,原因很简单,因为很难使XMLHTTPRequest与所有主流浏览器兼容。如果你想让他们加载你的URL,只需在URL中添加一个img标签就容易多了

发布到第三方网站

$.post(”http://some-bank.com/transfer-money.php", 
{金额:“10000”,记入账户:“xxxx”})
可以用

<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>

您将毫无戒心的访问者转化为拒绝服务攻击者

另外,想象一下一个跨站点脚本窃取了你所有的facebook内容。它打开一个IFrame并导航到Facebook.com


你已经登录到facebook(cookie),它会读取你的数据/朋友。而且做得更多。

嗯,显然你不是唯一一个有这种感觉的人

编辑:上面的搜索链接了一个有趣的讨论:

看起来,允许跨站点xmlhttp请求(即8、FF3等)的提案正在进行中,尽管我希望在我为我的站点编写代码时它们就在那里:)
还有兼容性的问题。。。还需要一段时间,它才会无处不在。

当您向服务器发送HTTP请求时,服务器设置的cookie也会通过浏览器发送回服务器。服务器使用这些cookie来确定用户已登录等事实

恶意攻击者可以利用此漏洞,借助某些JavaScript,攻击者可以在用户不知情的情况下在其他网站上窃取信息或执行未经授权的命令

例如,可以要求用户访问具有以下JavaScript代码的站点(假设为jQuery):


$.post(”http://some-bank.com/transfer-money.php", 
{金额:“10000”,记入账户:“xxxx”})
现在,如果用户在执行上述代码时真的登录到银行,攻击者可能已将10000美元转移到XXX帐户

这种攻击称为跨站点请求伪造(XSRF)。有更多关于这方面的信息

这主要是因为存在相同的源策略,浏览器不允许您在不同于源的域上执行XMLHttpRequests


关于允许跨域XHR的讨论正在进行中,但我们必须看看这是否真的被接受。

这是一个问题,因为正如您所提到的,它可能被用于不好的目的。它也可以出于良好的目的使用,因此,正在开发跨域协议

两个最大的问题是,当它与跨站点脚本(XSS)和跨站点请求伪造(CSRF)结合使用时。这两个都是严重的威胁(这就是他们进入OWASP前10名和SAN 25名的原因)

我能看到它被滥用的唯一方式是,如果有人注入Javascript

这是XSS,太多的应用程序仍然脆弱,如果浏览器安全模型不阻止X域Ajax,他们将用户打开到相当大的攻击向量。 您可以简单地向文档中添加img、script或iframe元素,以使其请求第三方URL


是的,但这些将发送HTTP_推荐人,并且(通过其他方式)可以被阻止以防止CSRF。AJAX调用可以更容易地欺骗头部,并允许使用其他方法绕过传统的CSRF保护。

我认为这与普通XSRF攻击的另一个区别是,您也可以通过javascript处理返回的数据。

我不知道最大的问题是什么?将AJAX调用发送到其他域,然后将其发送到您的应用程序,然后将过滤后的数据转发到其他域,如果确实需要,解析返回的数据,并将其提供给用户

处理敏感的AJAX请求?通过检查报头、存储会话时间数据或过滤传入的IP地址到您信任的来源或您的应用程序,确定传入的吸盘

我个人希望在将来看到的是,默认情况下,在web服务器、框架和CMS上,对所有传入请求都提供坚如磐石的安全性,然后明确定义将解析来自外部源的请求的资源

为什么不允许Ajax HTTP请求跨越域边界

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

正是这些因素的组合可能导致脆弱性。有人建议添加一种省略用户凭证的跨域AJAX

您可以简单地向文档中添加img、script或iframe元素

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

(除了故意设置为允许的脚本、允许的跨域脚本,或者有人犯了严重错误的脚本。)

您可以在根本不使用它的情况下进行XSS攻击。向第三方发布
<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>
<script type="text/javascript">
  $.post("http://some-bank.com/transfer-money.php", 
         { amount: "10000", to_account: "xxxx" })
</script>
<body onload="document.getElementById('InvisbleForm').submit()" ...