`

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 之外,几乎都无一例外对这一属性予以了支持。
  当然对于中国开发者来说,需要考虑的问题更加复杂一些:在这个神奇的地方,有大量的用户使用的浏览器并不在以下的列表中,他们使用的是以下面浏览器中的一种或者数种为内核的“精装版”浏览器。这些浏览器厂商对于同源策略、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 代码,几乎只需要很小的代价就可以获得巨大的安全收益。
  参考文章
http://en.wikipedia.org/wiki/HTTP_cookie
https://www.owasp.org/index.php/HttpOnly
分享到:
评论
1 楼 wf6916311 2012-06-28  
   

相关推荐

    EditThisCookie.crx cookie编辑导入导出利器

    《EditThisCookie.crx:强大的Cookie管理工具及与curl的集成》 在互联网浏览中,Cookie扮演着重要的角色,它们存储用户信息、保持登录状态、个性化网页内容等。EditThisCookie.crx是一款专为Chrome浏览器设计的强大...

    cookie机制

    2. 持久Cookie(Persistent Cookie):这类Cookie会保存在客户端磁盘上,它们的过期时间可以由服务器指定,即使关闭浏览器或重启计算机,它们依然有效。 ### Cookie的应用场景 - **用户认证**:存储用户的登录信息...

    cookie

    标题中的“cookie”一词指的是Web开发中的一种技术,用于在客户端存储小量信息。Cookie是服务器发送到用户浏览器并由浏览器保存的一段文本数据,主要用于维持用户会话状态、个性化设置、跟踪用户行为等。在Web应用中...

    cookie实现自动登入

    在互联网应用中,实现用户自动登录功能通常会利用Cookie这一技术。Cookie是由服务器发送到用户的浏览器并存储在本地的一小块数据,它包含了用户的一些关键信息,如用户名、登录状态等,以便下次用户访问时,服务器能...

    flask-session-cookie-manager

    标题“flask-session-cookie-manager”指的是一个Python应用,它专门针对Flask框架,用于管理和操作session cookie。在Web开发中,session cookie是服务器用来跟踪用户状态的一种方式,特别是在无状态的HTTP协议上...

    EditThisCookie1.6.3.crx

    方式1. 直接安装EditThisCookie1.6.3.crx设置浏览器cookie; !! 如果1.方式不好用使用方式2 方式2.解压zip文件->chrome选择开发者模式->加载已解压的压缩程序->选择对应的压缩文件目录

    jquery.cookie.js

    引入JS文件操作cookie更加便捷,可以直接 $.cookie获取和设置cookie对象

    Cookie浏览器

    **Cookie浏览器** Cookie浏览器是一种特殊的网络浏览工具,它利用了HTTP协议中的Cookie技术来实现特定功能,如网页登录绕过和邮箱免登录。Cookie是Web服务器在用户浏览器上存储的一小段数据,用于识别用户身份、...

    browser-cookie 获取浏览器cookie

    ### browser-cookie3:获取浏览器cookie #### 一、概述 `browser-cookie3` 是一个用于Python 3的库,能够帮助用户将当前浏览器中的cookies提取出来,并存储到一个`cookiejar`对象中,从而实现无需登录即可通过...

    php更新cookie内容的详细方法

    在上述函数中,$var参数是Cookie的名称,$value是要设置的值,$time是Cookie过期的时间戳,$path和$domain指定了Cookie的路径和域,$s是一个布尔值,指定Cookie是否仅通过安全连接传输。 使用这个函数的示例代码...

    C# 调用 Cefsharp浏览器获取登录后的cookie

    在IT领域,尤其是在Web开发中,获取登录后的cookie对于实现自动化测试、数据抓取或模拟用户行为等功能至关重要。本文将详细讲解如何使用C#编程语言结合CefSharp库来实现这一目标。 首先,C#是一种面向对象的编程...

    cookie总结

    这是一篇关于cookie的来源,以及cookie的简单介绍,有cookie的一些方法的实例,进行简单的cookie总结

    PHP Cookie学习笔记

    Cookie是一种存储在用户计算机上的文本文件,由Web服务器创建,并可以被同一服务器的页面读取。它是一种网络技术,可以用来存储和跟踪访问者在网站上的活动。Cookie的主要功能可以概括为: 1. 记录用户信息:包括...

    细说Cookie

    Cookie虽然是个很简单的东西,但它又是WEB开发中一个很重要的客户端数据来源,而且它可以实现扩展性很好的会话状态,所以我认为每个WEB开发人员都有必要对它有个清晰的认识。本文将对Cookie这个话题做一个全面的描述...

    javascript创建和存储cookie示例

    ### JavaScript 创建和存储 Cookie 示例知识点 #### 1. Cookie 概述 Cookie 是网络技术中的一种机制,允许服务器在用户计算机上存储一些信息。当浏览器在未来的请求中访问同一个服务器时,服务器可以通过这个机制...

    Jquery cookie操作代码

    在Web开发中,Cookie是服务器发送到用户浏览器并保存在本地的一小块数据。它可以被网站用来跟踪用户的状态。由于JavaScript原生操作Cookie有诸多不便,JQuery提供了一个方便操作Cookie的插件,使得开发者能够更简单...

    Cookie 小记

    Cookie是Web应用中常见的一种数据存储机制,它用于在客户端(用户的浏览器)和服务器之间传递状态信息。在本文中,我们将深入探讨Cookie的工作原理、如何设置过期时间以及与Session的对比。 1. **Cookie的清除** ...

    解决java后台登录前后cookie不一致问题

    在Java Web开发中,Cookie是用于在客户端存储和传递数据的一种机制,而Session则是在服务器端维护用户状态的关键工具。当涉及到用户登录流程时,Cookie和Session通常一起使用,以保持用户会话的连续性。然而,有时会...

Global site tag (gtag.js) - Google Analytics