购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 同源策略

同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略的基础之上的,浏览器只是针对同源策略的一种实现。

对于客户端Web安全的学习与研究来说,深入理解同源策略是非常重要的,也是后续学习的基础。很多时候浏览器实现的同源策略是隐性、透明的,很多因为同源策略导致的问题并没有明显的出错提示,如果不熟悉同源策略,则可能一直都会想不明白问题的原因。

浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。

这一策略极其重要,试想如果没有同源策略,可能 a.c om 的一段JavaScript脚本,在b.com未曾加载此脚本时,也可以随意涂改b.com的页面(在浏览器的显示中)。为了不让浏览器的页面行为发生混乱,浏览器提出了“Origin”(源)这一概念,来自不同Origin的对象无法互相干扰。

对于JavaScript来说,以下情况被认为是同源与不同源的。

浏览器中JavaScript的同源策略(当JavaScript被浏览器认为来自不同源时,请求被拒绝)

由上表可以看出,影响“源”的因素有:host(域名或IP地址,如果是IP地址则看做一个根域名)、子域名、端口、协议。

需要注意的是,对于当前页面来说,页面内存放JavaScript文件的域并不重要,重要的是加载JavaScript页面所在的域是什么。

换言之,a.com通过以下代码:

加载了 b.co m 上的b.js,但是b.js 是运行在a.com页面中的,因此对于当前打开的页面(a.com页面)来说,b.js的Origin 就应该是 a.com 而非 b.com。

在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以跨域加载资源,而不受同源策略的限制。这些带“src”属性的标签每次加载时,实际上是由浏览器发起了一次GET请求。不同于XMLHttpRequest的是,通过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读、写返回的内容。

对于XMLHttpRequest来说,它可以访问来自同源对象的内容。比如下例:

但XMLHttpRequest受到同源策略的约束,不能跨域访问资源,在AJAX应用的开发中尤其需要注意这一点。

如果XMLHttpRequest能够跨域访问资源,则可能会导致一些敏感数据泄露,比如CSRF的token,从而导致发生安全问题。

但是互联网是开放的,随着业务的发展,跨域请求的需求越来越迫切,因此W3C委员会制定了XMLHttpRequest跨域访问标准。它需要通过目标域返回的HTTP头来授权是否允许跨域访问,因为HTTP头对于JavaScript来说一般是无法控制的,所以认为这个方案可以实施。注意:这个跨域访问方案的安全基础就是信任“JavaScript无法控制该HTTP头”,如果此信任基础被打破,则此方案也将不再安全。

跨域访问请求过程

具体的实现过程,在本书的“HTML 5安全”一章中会继续探讨。

对于浏览器来说,除了DOM、Cookie、XMLHttpRequest会受到同源策略的限制外,浏览器加载的一些第三方插件也有各自的同源策略。最常见的一些插件如Flash、Java Ap plet、Silverlight、Google Gears等都有自己的控制策略。

以Flash为例,它主要通过目标网站提供的crossdomain.xml文件判断是否允许当前“源”的Flash跨域访问目标资源。

以www.qq.com的策略文件为例,当浏览器在任意其他域的页面里加载了Flash后,如果对www.qq.com发起访问请求,Flash会先检查www.qq.com上此策略文件是否存在。如果文件存在,则检查发起请求的域是否在许可范围内。

www.qq.com的crossdomain.xml文件

在这个策略文件中,只有来自 *.qq.com 和 *.g timg.com 域的请求是被允许的。依靠这种方式,从Origin的层面上控制了Flash行为的安全性。

在Flash 9及其之后的版本中,还实现了MIME检查以确认crossdomain.xml是否合法,比如查看服务器返回HTTP头的Content-Type是否是text/*、application/xml、application/xhtml+xml。这样做的原因,是因为攻击者可以通过上传crossdomain.xml文件控制Flash的行为,绕过同源策略。除了MIME检查外,Flash还会检查crossdomain.xml是否在根目录下,也可以使得一些上传文件的攻击失效。

然而浏览器的同源策略也并非是坚不可摧的堡垒,由于实现上的一些问题,一些浏览器的同源策略也曾经多次被绕过。比如下面这个IE 8的CSS跨域漏洞。

www.a.com/test.html:

www.b.com/test2.html:

在www.b.com/test2.html中通过@import 加载了 h ttp://www.a.com/test.html 为CSS文件,渲染进入当前页面DOM,同时通过 do cument.body.currentStyle.fontFamily 访问此内容。问题发生在IE的CSS Pa rse的过程中,IE将fontFamily后面的内容当做了value,从而可以读取www.a.com/test.html 的页面内容。

在www.b.com下读取到了www.a.com的页面内容

我们前面提到,比如<script>等标签仅能加载资源,但不能读、写资源的内容,而这个漏洞能够跨域读取页面内容,因此绕过了同源策略,成为一个跨域漏洞。

浏览器的同源策略是浏览器安全的基础,在本书后续章节中提到的许多客户端脚本攻击,都需要遵守这一法则,因此理解同源策略对于客户端脚本攻击有着重要意义。同源策略一旦出现漏洞被绕过,也将带来非常严重的后果,很多基于同源策略制定的安全方案都将失去效果。 IiyYmh0mXQE4hIybfrjqXd1acglyEqb3IZFqTKXCKPEVTPKNhhx+IPOAHIJiz0rd

点击中间区域
呼出菜单
上一章
目录
下一章
×