Cookie安全漫谈

yibin 2015-02-09 建站源码 537

在Web应用中,Cookie很容易成为安全问题的一部分。从以往的经验来看,对Cookie在开发过程中的使用,很多开发团队并没有形成共识或者一定的规范,这也使得很多应用中的Cookie成为潜在的易受攻击点。在给Web应用做安全架构评审(Security architecture review)的时候,我通常会问设计人员以下几个问题:


  1. 你的应用中,有使用JavaScript来操作客户端Cookie吗?如果有,那么是否必须使用JavaScript才能完成此应用场景?如果没有,你的Cookie允许JavaScript来访问吗?
  2. 你的网站(可能包含多个Web应用)中,对于Cookie的域(Domain)和路径(Path)设置是如何制定策略的?为何这样划分?
  3. 在有SSL的应用中,你的Cookie是否可以在HTTP请求和HTTPS请求中通用?

在实际的应用场景中,Cookie被用来做得最多的一件事是保持身份认证的服务端状态。这种保持可能是基于会话(Session)的,也有可能是持久性的。不管哪一种,身份认证Cookie中包含的服务端票据(Ticket)一旦泄露,那么服务端将很难区分带有此票据的用户请求是来自于真实的用户,或者是来自恶意的攻击者。在实际案例中,造成Cookie泄露最多的途径,是通过跨站脚本(XSS, Cross Site Script)漏洞。攻击者可以通过一小段JavaScript代码,偷窃到代表用户身份的重要的Cookie标示。由于跨站脚本漏洞是如此的普遍(不要以为简单的HTML Encode就可以避免被跨站,跨站是一门很深的学问,以至于在业界衍生出一个专用的名词:跨站师),几乎每一个站都无法避免,所以这种方式是实际攻防中被普遍使用的一种手段。

避免出现这种问题的首要秘诀就是尽所有的可能,给你的Cookie加上HttpOnly的标签。HttpOnly的具体使用不在本文的讨论范围内,否则作者略有骗InfoQ稿酬的嫌疑。一个大家所不太熟悉的事实是,HttpOnly是由微软在2000年IE6 Sp1中率先发明并予以支持的。截止现在,HttpOnly仍然只是一个厂商标准,但是在过去的十余年中,它得到了众多浏览器的广泛支持。

下表是OWASP整理的关于主流浏览器对HttpOnly支持情况的一个总结。从表中可以看出,目前主流的浏览器,除了Android之外,几乎都无一例外对这一属性予以了支持。



当然对于中国开发者来说,需要考虑的问题更加复杂一些:在这个神奇的地方,有大量的用户使用的浏览器并不在以下的列表中,他们使用的是以下面浏览器中的一种或者数种为内核的“精装版”浏览器。这些浏览器厂商对于同源策略、HttpOnly Cookie、证书管理等安全规范的支持情况,有待于进一步调查

 






















Browser
Version
Prevents Reads
Prevents Writes
Microsoft Internet Explorer
10
Yes
Yes
Microsoft Internet Explorer
9
Yes
Yes
Microsoft Internet Explorer
8
Yes
Yes
Microsoft Internet Explorer
7
Yes
Yes
Microsoft Internet Explorer
6 (SP1)
Yes
No
Microsoft Internet Explorer
6 (fully patched)
Yes
Unknown
Mozilla Firefox
3.0.0.6+
Yes
Yes
Netscape Navigator
9.0b3
Yes
Yes
Opera
9.23
No
No
Opera
9.5
Yes
No
Opera
11
Yes
Unknown
Safari
3
No
No
Safari
5
Yes
Yes
iPhone (Safari)
iOS 4
Yes
Yes
Google's Chrome
Beta (initial public release)
Yes
No
Google's Chrome
12
Yes
Yes


Android

扫码添加微信