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

问题描述:

在很多地方我见过人们都在谈论跨域XMLHttpRequest,这是不可能的,由于安全原因。但是,我还没有找到一个帖子,指出那些安全原因究竟是什么?使用跨域XMLHttpRequest有哪些安全风险?

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

但是,我只想知道由于跨域XMLHttpRequest使用情况可能会出现哪些安全问题?

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

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

这当然是一个疯狂的夸张,幸好不可能感谢相同的来源政策。

你现在感觉安全吗?

+0

是的,我现在感觉更安全。 +1和谢谢。 :) –

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

JSONP仅仅是一个围绕这个安全措施的工作,在这个安全措施中,你给目的地一个回调,并将它们通过这个回调交给你。

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

没有这些“安全原因”整个互联网,你知道它不可能存在。事实上,我会走出一条腿,说有没有规则是比同源政策更重要的互联网安全。

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

没有单一的同源策略,但规则明确规定在Google Browser Security handbook。这些都非常合乎逻辑,而且各种平台的规则非常相似,因为这是因特网必须工作

通过执行Access-Control-Allow-Origin: *,您将丧失您的网页浏览器授予您的权利。这有主要安全影响。您将无法使用令牌来保护CSRF免于CSRF。 capthca可以缓解这个问题,同时检查引用者也可能有帮助(如果源是HTTPS,它将会是空白的)。您应该阅读CSRF prevention cheat sheet