Cookie安全漫谈
在Web应用中,Cookie很容易成为安全问题的一部分。从以往的经验来看,对Cookie在开发过程中的使用,很多开发团队并没有形成共识或者一定的规范,这也使得很多应用中的Cookie成为潜在的易受攻击点。在给Web应用做安全架构评审(Security architecture review)的时候,我通常会问设计人员以下几个问题:
- 你的应用中,有使用JavaScript来操作客户端Cookie吗?如果有,那么是否必须使用JavaScript才能完成此应用场景?如果没有,你的Cookie允许JavaScript来访问吗?
- 你的网站(可能包含多个Web应用)中,对于Cookie的域(Domain)和路径(Path)设置是如何制定策略的?为何这样划分?
- 在有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之外,几乎都无一例外对这一属性予以了支持。
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代码,几乎只需要很小的代价就可以获得巨大的安全收益。
Cookie安全漫谈相关推荐
- Nginx 变量漫谈
Nginx 变量漫谈之变量插值(一) Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序.当然,是不是"图灵完全的" ...
- 互联网架构设计漫谈 (3)
互联网架构设计漫谈 (3) 中小型互联网公司在并发量不高的情况下可以选用软件负载均衡作为代理层,他们通常和更靠外的"接入层"的硬件负载均衡器合作,为用户提供更好的服务.软件负载均衡 ...
- 前端拦截url参数xss攻击_闲庭信步聊前端 - 漫谈XSS
闲庭信步聊前端 - 漫谈XSS 什么是XSS? 众所周知XSS是Cross-Site Scripting(跨站脚本攻击)的简称,但是英文的缩写明明是CSS为什么叫XSS呢?---历史遗留问题,因为CS ...
- 定向抓取漫谈 长孙泰
定向抓取漫谈 长孙泰 网络爬虫(web crawler)又称为网络蜘蛛(web spider)是一段计算机程序,它从互联网上按照一定的逻辑和算法抓取和下载互联网的网页,是搜索引擎的一个重要组成部分.一 ...
- SSO(单点登录)技术漫谈
目录 1. 名词解释 2. 简介 3. SSO的优势 4. 产品表现 5. 客户需求 6. SSO技术漫谈 7. 基础组件 8. 反向代理SSO 9. 有端SSO 10. 参考资料 1. 名词解释 S ...
- 谷歌FLoC与禁用第三方Cookie后的江湖道术
隐私和安全总是协助寡头把花园围墙越砌越高,同时花园围墙也常常侵蚀一些开放的商业模式,技术创新却不断支持新的商业模式和客户需求.今天讲的事情就是浏览器禁用三方Cookie后的商业模式和技术创新. 科技向 ...
- HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)...
HTTP协议漫谈 简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲解. ...
- Network下方什么请求也没有_利用postman进行接口测试并发送带cookie请求的方法
顾翔老师的<软件测试技术实战设计.工具及管理>网上购买地址: https://item.jd.com/34295655089.html <基于Django的电子商务网站>网上购 ...
- HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)
TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...
最新文章
- PHP:isset()-检测变量是否被设置
- title和alt属性
- 视频会议的分类和适用范围详解
- 分布式缓存之Memcache
- oracle100个常见问题,Oracle初学者必知的100个问题(三)
- flutter 导航页面转换动画效果
- TensorFlow错误:TypeError: __init__() got an unexpected keyword argument 'serialized_options'
- python报错defined_python问卷星报错NameError: name 'filename' is not defined
- 关于HashMap初始化容量问题
- nio2 java_java nio2
- 在一亿个数的有序数组中查找一个数所用时间
- 2016.1.20 总结(for语句,选择语句和循环语句混合使用)
- 2012 Multi-University Training Contest 2
- python实现学生座位表排表
- 继承CAcUiStringEdit,改变编辑框的字体颜色,以及背景的颜色
- 计算机考研专业课考c语言的大学,【择校必看】十三所计算机专业课只考数据结构的985院校!...
- 新法将赋予FBI无需法院命令也能阅读公民邮件的权力
- 如何从A页面跳转到B页面并且带着很长的参数
- 信用卡客户风险评估-聚类分析实验报告(python)
- 如何根据导入项目的config.properties配置文件去连接远程数据库?
热门文章
- python安装教程3.8.5-Python 3.8.5下载
- python3爬虫实例-自己动手,丰衣足食!Python3网络爬虫实战案例
- python代码案例详解-Python综合应用名片管理系统案例详解
- python读取文件第n行-python读取文件的前几行
- 编程软件python中的if用法-给Python初学者的一些技巧
- python简易图形-python图形用户界面(四):教你实现一个简单实用的计时器
- python三层装饰器-python装饰器的一个妙用
- 为什么mac系统下载python-mac可以升级python吗 知乎
- python 调用linux命令-Python Linux系统管理之Python中执行外部命令
- 初学python还是swift-Python并不完美,Swift正在成长为深度学习语言 !