同源策略

古代的楚河汉界明确规定了楚汉两军的活动界限,理应遵照,不然必天下大乱,而事实上天下曾大乱后又统一。这里咱们不用管这些“分久必合,合久必分”的问题,关键是看到这里规定的“界限”。Web世界之因此能如此美好地呈如今咱们面前,多亏了浏览器的功劳,不过浏览器不是一个花瓶——只负责呈现,它还制定了一些安全策略,这些安全策略有效地保障了用户计算机的本地安全与Web安全。跨域

 注:浏览器

计算机的本地与Web是不一样的层面,Web世界(一般称为Internet域)运行在浏览器上,而被限制了直接进行本地数据(一般称为本地域)的读写。安全

同源策略是众多安全策略的一个,是Web层面上的策略,很是重要,若是少了同源策略,就等于楚汉两军没了楚河汉界,这样天下就大乱了。cookie

同源策略规定:不一样域的客户端脚本在没明确受权的状况下,不能读写对方的资源。异步

下面分析同源策略下的这个规定,其中有几个关键词:不一样域、客户端脚本、受权、读写、资源。spa

1.不一样域或同域

同域要求两个站点同协议、同域名、同端口,好比:表 1-1 展现了表中所列站点与http://www.foo.com是否同域的状况。对象

表1-1  是否同域状况接口

站    点ip

是否同域ci

原    因

https://www.foo.com

不一样域

协议不一样,https与http是不一样的协议

http://xeyeteam.foo.com

不一样域

域名不一样,xeyeteam子域与www子域不一样

http://foo.com

不一样域

域名不一样,顶级域与www子域不是一个概念

http://www.foo.com:8080

不一样域

端口不一样,8080与默认的80端口不一样

http://www.foo.com/a/

同域

知足同协议、同域名、同端口,只是这里多了一个目录而已

从表1-1中的对比状况能够看出,咱们一般所说的两个站点同域就是指它们同源。

2.客户端脚本

客户端脚本主要指JavaScript(各个浏览器原生态支持的脚本语言)、ActionScript(Flash的脚本语言),以及JavaScript与ActionScript都遵循的ECMAScript脚本标准。Flash提供通讯接口,使得这两个脚本语言能够很方便地互相通讯。客户端的攻击几乎都是基于这两个脚本语言进行的,固然JavaScript是最普遍的。

被打入“冷宫”的客户端脚本有VBScript,因为该脚本语言相对较孤立,又有当红的JavaScript存在,因此实在是没有继续存在的必要。

3.受权

通常状况下,看到这个词,咱们每每会想到服务端对客户端访问的受权。客户端也存在受权现象,好比:HTML5新标准中提到关于AJAX跨域访问的状况,默认状况下是不容许跨域访问的,只有目标站点(假如是http://www.foo.com)明确返回HTTP响应头:

Access-Control-Allow-Origin: http://www.evil.com

那么www.evil.com站点上的客户端脚本就有权经过AJAX技术对www.foo.com上的数据进行读写操做。这方面的攻防细节颇有趣,相关内容在后面会详细介绍。

 注:

AJAX是Asynchronous JavaScript And XML的缩写,让数据在后台进行异步传输,常见的使用场景有:对网页的局部数据进行更新时,不须要刷新整个网页,以节省带宽资源。AJAX也是黑客进行Web客户端攻击经常使用的技术,由于这样攻击就能够悄无声息地在浏览器后台进行,作到“杀人无形”。

4.读写权限

Web上的资源有不少,有的只有读权限,有的同时拥有读和写的权限。好比:HTTP请求头里的Referer(表示请求来源)只可读,而document.cookie则具有读写权限。这样的区分也是为了安全上的考虑。

5.资源

资源是一个很普遍的概念,只要是数据,均可以认为是资源。同源策略里的资源是指Web客户端的资源。通常来讲,资源包括:HTTP消息头、整个DOM树、浏览器存储(如:Cookies、Flash Cookies、localStorage等)。客户端安全威胁都是围绕这些资源进行的。

 注:

DOM全称为Document Object Model,即文档对象模型,就是浏览器将HTML/XML这样的文档抽象成一个树形结构,树上的每一个节点都表明HTML/XML中的标签、标签属性或标签内容等。这样抽象出来就大大方便了JavaScript进行读/写操做。Web客户端的攻击几乎都离不开DOM操做。

到此,已经将同源策略的规定分析清楚,若是Web世界没有同源策略,当你登陆Gmail邮箱并打开另外一个站点时,这个站点上的JavaScript就能够跨域读取你的Gmail邮箱数据,这样整个Web世界就无隐私可言了。这就是同源策略的重要性,它限制了这些行为。固然,在同一个域内,客户端脚本能够任意读写同源内的资源,前提是这个资源自己是可读可写的。

相关文章
相关标签/搜索