我一直想知道XHR跨域限制的目的是什么。
似乎是为了防止恶意注入的Javascript向攻击者发送私有数据。然而,通过注入script
或img
标签(或任何其他外部资源),可以很容易地将数据发送到任何域。
如果任何任意网站都可以对您的网站进行XHR调用,则可能发生以下情况:
- 无辜用户Alice登录到您的安全网站并获取安全会话cookie。
- 在另一个浏览器选项卡中,Alice访问了Bob的邪恶黑客网站(她认为这只是一个Justin Bieber的视频)
- Bob的页面向您的安全网站发出XHR。如果没有跨域策略,浏览器将向您的网站发出请求—包括安全会话cookie —并检索结果。这些结果可能包括爱丽丝登录你的安全网站时可用的任何信息。
事实上,即使使用跨域策略,Bob的邪恶网站也可以通过发布表单向您的服务器发送HTTP请求。它将无法看到结果,但如果Bob很聪明,他可能会在您的站点中发现一个URL,该URL允许POST进行某些活动,即使它不是来自您某个页面上的表单。这就是所谓的跨站请求伪造,这是浏览器无法保护你的。
同站安全策略的设计使得攻击者能够将恶意脚本注入到网页中,需要满足以下条件之一:
- web页面引用了位于web页面域外的脚本或图像资源,攻击者可以控制这些外部资源之一。
- 攻击者可以访问网页 的主机web服务器
- 或者攻击者控制了web服务器和浏览器客户端之间路由上的机器(对于不安全的http连接)
如果你建立的网站只引用你自己域内的资源,并且你不做任何愚蠢的事情,比如接受嵌入在URL中的javascript(或SQL)或对用户输入文本使用javascript eval(),那么你的网页上的数据隐私就处于相对较好的状态。
如果您链接到驻留在不同域的脚本或图像资源,那么您的网站的安全性也取决于该外部域的安全性。
防止上述第3条(中间人攻击)的最佳方法是使用https协议而不是http来保护对服务器(页面,脚本和图像)的所有请求。中间的人无法为目标域生成有效的加密证书,因此浏览器至少可以警告用户该站点有问题。同一站点安全的经典案例是在攻击者的evil.com服务器托管的页面上将目标网页包装在iframe中。如果父页面URL和iframe内容URL在同一个域中,那么它们就可以相互通信并查看彼此的内部数据、变量、DOM等。如果域不同,同一域安全策略声明浏览器不应该允许iframe看到其父的任何变量或DOM信息,也不允许其父看到iframe内部的变量或DOM。这是为了防止两个域之间意外或不适当的数据交换。
如果缺少相同域的安全策略,那么对于攻击者来说,将您的银行网站包装在iframe中是一件非常简单的事情,通过包装的网站引导您(发送给您的虚假电子邮件上的链接)登录,并随意观察您的所有银行活动。从那里,他们可以在几秒钟内榨干你的账户。
还请注意,XHR最初是作为第三方扩展添加到浏览器环境中的,因此最好的做法是遵循现有的浏览器安全模型来处理客户机请求。XHR遵循与浏览器用于获取html页面、脚本和图像相同的规则。如果从一开始就将XHR设计到HTML规范中,而不是后来添加到规范中,那么XHR的情况可能会有所不同。请看HTML5 PostMessage规范的例子
您可以制作一个网站来访问一些导致DoS的网站。这是一种可能的跨XHR恶意使用
查看下面的wiki文章,它可能会有所帮助。
http://en.wikipedia.org/wiki/Same_origin_policy