【web安全系列】(一)浏览器安全
作为一个web开发人员,浏览器安全是不可或缺的知识。一方面,浏览器天生就是一个客户端,如果具备了安全功能,就可以像安全软件一样对用户上网起到很好的保护作用;另一方面,浏览器安全也成为浏览器厂商之间竞争的一张底牌,浏览器厂商希望能够针对安全简历技术门槛,已获得竞争优势。
本文将给大家介绍一下浏览器的安全功能
同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
这一策略非常重要,浏览器提出了“Origin”(源)这一概念,限制了来自不同Origin的对象无法互相干扰。例如,浏览器打开两个 tab 页 A.html, B.html, A 页面的脚本是无法随意修改 B 页面的。
对于 Javascript 来说,影响“源”的因素有: host,子域名,端口,协议。
需要注意的是,对于当前页面来说,页面内存放 Javascript 文件的域并不重要,重要的是加载 Javascript 的域是什么
换言之,a.com 通过以下代码
<script src="http://b.com/b.js"></script>
加载了 b.com 上的 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 受到同源策略的约束,不能跨域访问资源,在Ajax应用的开发中尤其要注意这一点。
互联网是开放的,随着业务的发展,跨域请求资源越来越迫切,因此 W3C 委员会制定了 XMLHttpRequest 跨域访问标准。它需要通过目标域返回的 http 头来授权是否允许跨域访问。
具体实现之后章节会陆续讲到
对于浏览器来说,除了DOM、Cookie、XMLHttpRequest 会受到同源策略的限制外,浏览器加载的一些第三方插件也有个字的同源策略。最常见的插件如:Flash,Java Applet,Google Gears,Silverlight 等都有自己的控制策略。
然而浏览器的跨域策略也不是坚不可摧的堡垒,一些浏览器的同源策略也多次被绕过,比如下面这个IE8的CSS跨域漏洞。
IE8的CSS跨域漏洞
前面提到,比如<script>等标签仅能加载资源,但不能读,写资源的内容,这个漏洞能够跨域读取页面内容,因此绕过了同源策略,成为一个跨域漏洞。
浏览器沙箱
Sandbox 即沙箱,计算机发展到今天,SandBox 已经成为泛指“资源格力累模块”的代名词。沙箱的设计目的一般是为了让不可信任代码运行在一定的环境中,限制不可信任的代码访问隔离区外的资源。如果一定要跨越 SandBox 边界产生数据交换,则只能通过指定的数据通道,比如经过封装的 API 来完成,在这些 API 中会严格检查请求的合法性。
而对于浏览器来说,采用 Sandbox 技术,无疑可以让不受信任的网页代码运行在一个受限的环境中,从而保护本地文件的安全。
浏览器的多进程架构,将浏览器的各个功能分开,各个浏览器实例分开,当一个进程崩溃时,也不会影响到其他进程。
Goole Chrome 是第一个采取多进程架构的浏览器。Google Chrome 的主要进程为: 浏览器进程,渲染进程,插件进程,扩展进程。
多进程架构的一个很明显的好处是,相对于单进程浏览器,在发生崩溃时,多进程浏览器只会崩溃当前的 Tab 页,而单进程浏览器则会崩溃整个浏览器进程。
在现今的浏览器中,虽然有许多进程架构和 SandBox 保护,但浏览器所加载的一些第三方插件却往往不受 Sandbox 管辖,比如近年来 Pwn2Own 大会上被攻克的浏览器,往往都是因为第三方插件出现的安全漏洞导致的。Flash,PDF, .NetFramework 在近年来都成为浏览器攻击的热点。
恶意网站拦截
恶意网站拦截工作原理很简单,一般都是浏览器周期性的从服务器获取一份最新恶意网址的黑名单,如果用户上网时访问的网址存在于黑名单中,浏览器就会弹出一个警告页面。
常见的恶意网址分为两类: 一类是挂马网站,这些网站通常包含有恶意的脚本如 Javascript 或 Flash, 通过利用浏览器的漏洞(包括一些插件,空间漏洞)执行 shellcode,在用户电脑植入木马;另一类是钓鱼网站,通过模仿知名网站的相似页面来欺骗用户。
PhishTank 是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁。
类似的,Google 也公开了其内部使用的 SafeBrowsing API,任何组织和个人都可以在产品中接入,以获取Google的恶意网址库。
除了恶意网址黑名单拦截功能外,主流浏览器都开始支持EV SSL证书,以增强对安全网站的识别。Extended Validation SSL Certificates翻译为扩展验证型服务器证书(EV 服务器证书 或 EV SSL证书),申请该证书需要经过最彻底的身份验证,确保证书持有组织的真实性。应用该证书的网站,浏览器地址栏将呈现绿色,绿色地址栏将循环显示组织名称和作为证书颁发机构的VeriSign的名称,从而最大限度上确保网站的安全性,树立网站可信形象,不给欺诈钓鱼网站任何可乘之机。
因此网站在使用了 EV SSL 证书后,可以教育用户识别真实网址在浏览器地址栏中的“绿色”表现,以对抗钓鱼网站。
厂商的行动
为了在安全领域获得竞争力,微软率先在 IE8 中推出了 XSS Filter 功能,利用对抗反射型 XSS,微软率先推出这一功能,使得IE8在安全领域极具特色。
当用户访问的 URL 中包含了 XSS 攻击脚本时,IE 就会修改其中关键字符使得攻击无法完成,并对用户弹出提示。
Firefox 也不敢其后,在 Firefox 4 推出了 Content Security Policy(CSP),其做法是使用服务器返回的 X-Content-Security-Policy 头部来告诉页面应该遵守的规则。
X-Content-Security-Policy: policy
policy 的定义非常灵活,比如:allow 'self' *.mydomain.com
表示浏览器将信任 my domain.com 及其子域名下的内容
小结
浏览器的安全以同源策略为基础,加深理解同源策略,才能把握住浏览器安全的本质。
参考文献
1.ie8 filter