使用跨域XMLHttpRequest有哪些安全风险?

时间:2011-09-29 11:00:37

标签: ajax security xmlhttprequest cross-domain

在很多地方,我见过人们谈过跨域XMLHttpRequest,由于一些安全原因,这是不可能的。但是,我还没有找到一个帖子,说明安全原因实际上是什么?

人们已经提到JSONP是一个很好的选择。另一种方法是使用OriginAccess-Control-Allow-Origin标题。

但是,我只是想知道由于跨域XMLHttpRequest的使用会引起哪些安全问题?

3 个答案:

答案 0 :(得分:9)

我认为最好回答你的一个例子的问题,为什么它会非常糟糕。

你去我的网站(example.org)。我加载一个脚本,向facebook.com/messages/from/yourgirlfriend发出客户端AJAX请求。你碰巧登录到Facebook,你的浏览器告诉Facebook我的请求实际上是你。 Facebook很乐意向我提出有关您想要尝试的奇怪性事情的消息。我现在知道你的事情,你可能不想让我知道。

这当然是夸大其词,幸好不可能归功于相同的原产地政策。

你现在感觉不安全吗?

答案 1 :(得分:2)

如果没有这些“安全原因”,整个互联网就像你所知道的那样无法存在。事实上,我会站出来说,对于互联网安全而言,没有比同源政策更重要的规则

没有这些规则,谷歌,网络邮件帐户,没有网页可以进行身份​​验证,所以这些都不存在。就像你在每个域上都有XSS一样。您可以对gmail.com执行XHR并阅读任何人的电子邮件。 CSRF令牌不起作用,因为您可以阅读任何页面并伪造请求。

没有单一的同源策略,但规则明确列在Google Browser Security handbook中。这些是非常合乎逻辑的,各种平台的规则非常相似,因为这是互联网必须工作的方式。

通过执行Access-Control-Allow-Origin: *,您将丧失网页浏览器为该网页授予的权利。这具有主要安全隐患。您将无法使用令牌保护自己免受CSRF的侵害。 capthca可以缓解这个问题,同时检查referer也可能有帮助(如果原点是HTTPS,它将是空白的)。你应该阅读CSRF prevention cheat sheet

答案 2 :(得分:1)

如果允许,攻击者设法将Javascript注入您的页面(通过漏洞利用/社交工程)可以发送从您的客户端获取的数据(通常是敏感的),而无需他们知道(因为XMLHttpRequests不需要用户)要发生的行动,他们是沉默的)。这是一种浏览器安全措施。

JSONP只是围绕这个安全措施的一项工作,你可以给目的地一个回调,并委托他们通过这个回调给你回馈的任何内容。

修改 安全风险的示例:您通过网络登录到您的电子邮件帐户(如gmail或yahoo)。您继续浏览(在另一个选项卡中,甚至在当前选项卡中)到另一个恶意站点。此恶意网站尝试将XHR发送到您电子邮件帐户的同一网站。由于XHR是您的行为,并且由于它是客户端/浏览器端请求,因此该请求将具有您用于登录的相同会话,因此,此网站可以对您的帐户执行任何他们想要的操作(通过以下方式发送垃圾邮件)您的帐户,下载您的联系人,...等)。 另一个例子:在一个论坛中,有人设法将带有XHR的Javascript注入另一个网站。他现在可以从论坛中访问帖子的所有人(通过使用同一个网络电子邮件会话)窃取联系人列表(可能然后删除它们)。更不用说他可以分享访问他的帖子的论坛成员的会议,以获得他们在论坛中的任何数据(私人消息/朋友......等)。然后他可以将这些数据发送到他的服务器以保存它们。