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

6
在许多地方,人们谈论了跨域XMLHttpRequest,但由于一些安全原因,这是不可能的。然而,我没有找到一篇文章说明这些安全原因是什么?
有人提到JSONP是一个很好的替代方案。另一个选择是使用OriginAccess-Control-Allow-Origin头。
然而,我只想知道由于跨域XMLHttpRequest使用会引起哪些安全问题?
3个回答

10

我认为最好举个例子来说明为什么会非常糟糕。

你访问了我的网站(example.org)。我加载了一个脚本,该脚本发出了一个客户端的 AJAX 请求到 facebook.com/messages/from/yourgirlfriend。你碰巧已经登录了 Facebook,并且你的浏览器告诉 Facebook,这个请求实际上是由你发起的。Facebook很高兴地向我的请求返回了你想尝试的奇怪性行为信息的消息。现在我知道了你可能不希望我知道的一些事情。

当然,这种情况是夸张的,并且由于同源策略的存在而无法实现。

现在你感觉更安全了吗?


2
没有这些“安全原因”,你所知道的整个互联网都无法存在。事实上,我会冒险说没有什么规则比同源策略更重要,特别是对于互联网安全来说。
没有这些规则,任何网页都无法进行身份验证,包括谷歌、网络邮件帐户、SO等等,所有这些都无法存在。就好像你在每个域上都有XSS一样。你可以对gmail.com执行XHR并阅读任何人的电子邮件。CSRF令牌将无法工作,因为您可以阅读任何页面并伪造请求。
没有单一的同源策略,但规则在Google浏览器安全手册中明确说明。这些非常合乎逻辑,各平台的规则非常相似,因为这是互联网必须工作的方式
通过执行Access-Control-Allow-Origin: *,您放弃了浏览器为该页面授予的权利。这具有重大的安全影响。您将无法使用令牌保护自己免受CSRF攻击。验证码可以缓解此问题,还可以检查引用者是否有帮助(如果来源是HTTPS,则为空)。您应该阅读CSRF预防备忘单

1
如果允许的话,攻击者可以通过漏洞或社交工程将Javascript注入到您的页面中,并发送从客户端获取的数据(通常是敏感数据),而客户端并不知情(因为XMLHttpRequests不需要用户操作即可发生且它们是静默的)。这是一种浏览器安全措施。
JSONP只是绕过这种安全措施的一种方法,您可以向目标提供一个回调函数,并通过此回调函数委托他们返回任何他们想要给您的内容。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接