在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

Android 2.3

Unknown

Unknown

在我看来,一个Web应用的每一个Cookie都应该带上HttpOnly的标签。我没有看到这个决定可能带来的负面作用,如果一定要说有的话,那 么就是你的应用将不能再通过JavaScript来读写Cookie了。可是这真有必要吗?个人认为,JavaScript操作Cookie是一种不正常 的做法;可以用JavaScript操作Cookie完成的功能,一样可以用服务端响应Http头设置Cookie来完成。相反,设置所有的Cookie 为HttpOnly带来的巨大好处则非常明显:尽管你需要继续修复XSS漏洞,但是这些漏洞至少暂时不会让你的用户遭受大规模的账户损失。

关于Cookie的第二个话题是域设置。

浏览器在选择发送哪些本地Cookie到本次请求的服务端时,有一系列的比较和甄别。这些甄别中最重要的部分是Domain和Path的吻合。 Domain形如.abc.com的Cookie,会被发送给所有abc.com在80端口上的子域请求。但是反之则不行,这就是Cookie的域匹配 (domain match)原则。

在一个大型Web站点中,往往有多个应用,生存在不同的子域名或路径下。这些应用之间由于共享同一个域名,所以往往可能会彼此有操作对方应用 Cookie的能力。这种情况下,设计好Cookie的Domain和Path尤为重要。在实际设计工作中,最重要的一个安全原则就是:最小化授权。这意 味着,你需要将自己的Cookie可被访问到的范围降至最低。应用之间传递数据和共享信息的解决方案非常多,而通过Cookie这种用户输入(User input)来共享数据,是最不安全的解决方案之一。

Cookie另外一个不太常被使用的属性是Secure. 这个属性启用时,浏览器仅仅会在HTTPS请求中向服务端发送Cookie内容。如果你的应用中有一处非常敏感的业务,比如登录或者付款,需要使用 HTTPS来保证内容的传输安全;而在用户成功获得授权之后,获得的客户端身份Cookie如果没有设置为Secure,那么很有可能会被非HTTPS页 面中拿到,从而造成重要的身份泄露。所以,在你的Web站点中,如果使用了SSL,那么你需要仔细检查在SSL的请求中返回的Cookie值,是否指定了 Secure属性。

除此之外还值得特别指出的是,一些Web应用除了自己的程序代码中生成的Cookie,往往还会从其他途径生成一些Cookie。例如由Web Server或者应用容器自动生成的会话Cookie,由第三方库或者框架生成的Cookie等等。这些都需要进行有针对性的加固处理。

几乎每个站点都难以离开Cookie,但Cookie的使用因其貌似简单,而很容易被人轻视。重新审视应用中的Cookie代码,几乎只需要很小的代价就可以获得巨大的安全收益。

[Web前端]由cookies安全说开去的更多相关文章

  1. 大专生自学web前端到找到工作的前前后后

    先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...

  2. 大专生自学web前端前前后后

    先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...

  3. 大专生自学web前端到找到工作的经验

    先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...

  4. 学习web前端的免费12个学习网站,等你来撩

    我相信很多人刚喜欢web前端或者刚刚接触web前端的时候,都不愿意去花钱去培训或者买资料去学习,因为不知道自己会不会学好,或者只是一时脑热,所以就选择免费的去学习基础.编程学习 很多人包括一些企业家, ...

  5. web前端开发学习内容

    应该 具备的 知识技能 :懂web标准,熟练手写 xhtml css3 并符合 符合w3c标准                       代码能 兼容主流浏览器.ie6.7.8.9 ff 等.    ...

  6. 【理论面试篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题

    ##2017.10.30收集 面试技巧 5.1 面试形式 1)        一般而言,小公司做笔试题:大公司面谈项目经验:做地图的一定考算法 2)        面试官喜欢什么样的人 ü  技术好. ...

  7. 零基础转行web前端,如何高效的去学习web前端

    web前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,但学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联网时代不 ...

  8. 【编码题篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题

    编写一个方法 求一个字符串的字节长度假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var byt ...

  9. 开园了,将以此记录个人web前端之路

    记录.分享与学习 2015年5月中旬开始学习web前端到2015年6月底找到第一份相关工作,在学习与工作过程中通过网络获益良多,在此写下个人学习与工作过程中的总结与思考,记录个人成长,同时也希望能够帮 ...

随机推荐

  1. 使用Python发送HTML格式的邮件(收到的邮件有发送方才是正解)

    发送html格式的和普通文本格式差不多,只是MIMEText(content,"html","utf-8"))与MIMEText(content,"p ...

  2. bzoj2660: [Beijing wc2012]最多的方案

    题目链接 bzoj2660: [Beijing wc2012]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...

  3. NOIP差不多可以退役的退役记录

    好吧,现在既然苟回来了,就来回忆一下我NOIP2017的黑历史吧. Day-1: 原本以为是很平静的一天,上午学考机房强行断网,原因是腾出网速给对面学考的同学们查资料用.好吧没法刷题我只能选择颓废…… ...

  4. Codeforces.739E.Gosha is hunting(DP 带权二分)

    题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...

  5. 【洛谷】4317:花神的数论题【数位DP】

    P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...

  6. Python学习笔记(四):字符串的学习

    总结的内容: 1.字符串常用的方法 2.Python字符串格式化 3.Python字符串转义字 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符 ...

  7. 小程序在wxml页面中取整

    小程序无法像html中,在页面中直接parseInt() index.wxml {{price | Int}} 小程序还有另一种处理方法 wxs 是一种类似于js脚本的东西 filters.wxs v ...

  8. 小米路由通过SSH添加静态路由表之后无法跳转的问题

    1.确定系统已经开启了转发功能: /etc/sysctl.conf下的配置项目为net.ipv4.ip_forward = 1 2.关闭防火墙的REJECT,也就是修改/etc/config/fire ...

  9. systemtap 用户态调试3

    [root@localhost ~]# cat test.c #include <stdio.h> int main( void) { int a=0; a=fun(10,20); pri ...

  10. MVC对集合筛选,不使用Where(),而使用FindAll()

    当想对集合筛选的时候,经常想到用Where过滤,而实际上List<T>.FindAll()也是不错的选择. 如果有一个订单,属性有下单时间.区域等等.如何使用List<T>.F ...