基本的浏览器安全

427 阅读5分钟

前端阅读室

同源策略

同源策略是浏览器最核心也是最基本的安全功能。

同源意味着协议、host(域名或IP地址,如果是IP地址则看作一个根域名)、端口号相同。

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

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

但是互联网是开放的,跨域请求的需求也越来越迫切,因此W3C委员会制定了XMLHttpRequest跨域访问标准。它需要通过目标域返回的HTTP头来授权是否允许跨域访问,因为HTTP头对于JavaScript来说一般是无法控制的。

跨域访问请求过程

index.html -> Origin -> index.php index.php -> Access-Control-Allow-Origin -> index.html

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

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

如www.qq.com/crossdomain.xml

<cross-domain-policy>
<allow-access-from domain="*.qq.com" />
<allow-access-from domain="*.gtimg.com" />
</cross-domain-policy>

只有来自*.qq.com和*.gtimg.com域的请求是被允许的。

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

然而,一些浏览器的同源策略也曾被绕过,比如这个IE8的CSS漏洞

www.a.com/test.html:

<body>
  {}body{font-family:
  aaaaaaaaaaaa
  bbbbbbbbbbbbbbbbbbb
</body>

www.b.com/test2.html:

<style>
  @import url("http://www.a.com/test.html");
</style>
<script>
  setTimeout(function () {
    var t = document.body.currentStyle.fontFamily;
    alert(t);
  }, 2000);
</script>

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

  aaaaaaaaaaaa
  bbbbbbbbbbbbbbbbbbb
</body>

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

浏览器沙箱

在网页中插入一段恶意代码,利用浏览器漏洞执行代码,在用户电脑中植入木马,称为"挂马"。

Sandbox即沙箱,泛指"资源隔离类模块"的代名词。其设计的目的一般是为了让不可信任的代码运行在一定的环境中,限制不可信任代码访问隔离区之外的资源。如果一定要跨越Sandbox边界产生数据交换,则只能通过指定的数据通道。比如经过封装的API来完成,在这些API中会严格检查请求的合法性。

浏览器大多采用多进程架构,各个功能模块分开,各个浏览器实例分开。当一个进程崩溃时,不会影响到其他进程。如Google渲染进程由Sandbox隔离,网页代码与浏览器内核进程、操作系统进行通信都需要通过IPC channel,在其中会进行一些安全检查。

采用Sandbox技术,可以让不信任的网页代码、JavaScript代码运行在一个受到限制的环境中,从而保护本地桌面系统的安全。

但是浏览器安全是一个整体,浏览器所加载的一些第三方插件却往往不受Sandbox管辖,比如Flash、Java、PDF、.Net Framework都是浏览器攻击的热点。

恶意网址拦截

目前各个浏览器的恶意网址拦截功能都是基于"黑名单"的。一般浏览器周期性地从服务器端获取一份最新的恶意网址黑名单。如果用户上网时访问的网址存在于此黑名单中,浏览器就会弹出一个警告页面。

常见的恶意网址分为两类:一类是挂马网站,另一类是钓鱼网站,通过模仿知名网站的相似页面来欺骗用户。

除了恶意网址黑名单拦截功能,主流浏览器都开始支持EV SSL证书,其主要特色是浏览器会给予EV SSL证书特殊待遇,如在地址栏特别标注。

高速发展的浏览器安全

IE8推出的XSS Filter功能。当用户访问的URL中包含了XSS攻击的脚本时,IE会修改其中的关键字符使得攻击无效,并对用户弹出提示框。

Firefox4推出的CSP,由服务器返回一个HTTP头,并在其中描述页面应该遵循的安全策略。

浏览器的拓展与插件也会带来安全问题,除了插件可能存在漏洞外,插件其本身也可能存在恶意行为。

前端阅读室