`

Cookie安全漫谈

 
阅读更多
在 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 代码,几乎只需要很小的代价就可以获得巨大的安全收益。

  参考文章

分享到:
评论

相关推荐

    同源策略以及cookie安全策略

    【Cookie安全策略】是确保Cookie安全的重要手段,包括设置各种属性如Domain、Path、Secure、Expires、MaxAge和HttpOnly。HttpOnly属性可以防止JavaScript访问Cookie,从而减少Cookie被篡改或窃取的风险。然而,尽管...

    mvc中cookie安全

    **标题解析:**“mvc中cookie安全”这个标题聚焦于在使用Model-View-Controller (MVC)架构的Web应用程序中处理Cookie的安全性问题。在Web开发中,Cookie常用于存储用户状态信息,如会话ID,但如果不妥善管理,可能会...

    最全如何安全的处理cookie,不让cookie被利用

    史上最全如何安全的处理cookie,不让cookie被利用最全如何安全的处理cookie,

    C#操作cookie,解密加密cookie

    在IT领域,尤其是在Web开发中,Cookie的管理与安全至关重要。C#作为一种广泛使用的编程语言,在处理Cookie方面提供了丰富的功能,包括对Cookie的加密与解密。本文将深入探讨如何在C#中操作Cookie,以及如何实现...

    HTTP cookie.doc

    - **安全性**:虽然Cookie本身不是可执行代码,不包含恶意软件,但它们可能被用于非法目的,如跟踪用户活动或在某些情况下窃取敏感信息。 - **生命周期**:服务器可以设定Cookie的生命周期,过了这个时间,浏览器将...

    Cookie浏览器

    - Cookie篡改:恶意用户可能会尝试获取和修改他人的Cookie,实现冒充身份的目的,因此使用Cookie浏览器时应警惕网络安全。 - Cookie盗窃:网络钓鱼和恶意软件可能会窃取用户的Cookie,导致账户被盗。 - 隐私泄露...

    关于java应用cookie

    ### 关于Java应用Cookie知识点详解 #### 一、Cookie简介 ...通过以上介绍,我们可以了解到Java中Cookie的基本使用方法以及相关的安全性和注意事项。这些知识点对于开发基于Java的Web应用程序非常重要。

    桂林老兵cookie欺骗工具

    桂林老兵Cookie欺骗工具是一款在IT安全领域中被广泛讨论的工具,主要用于网络安全研究和测试。这个工具因其在Cookie管理及欺骗技术方面的应用而知名,尤其对于理解Web安全和防御策略的专家来说,它是一个重要的学习...

    FlashCookie 不被浏览器清除的Cookie

    FlashCookie,也称为Local ...总的来说,FlashCookie是一种强大的用户数据存储机制,但同时也带来了隐私和安全挑战。理解其工作原理以及如何管理和保护自己免受潜在风险的影响,对于网络用户和开发者来说都至关重要。

    cookie读写,子cookie

    在Web开发中,Cookie是一种非常重要的技术,用于在客户端和服务器之间传递状态信息。Cookie的主要功能包括用户会话管理、个性化设置保存、跟踪用户行为等。在这个“cookie读写,子cookie”主题中,我们将深入探讨...

    cookie记住账号密码

    这涉及到Web开发中的基本概念,主要包括Cookie的工作原理、安全性以及相关编程实践。 Cookie是服务器发送到用户浏览器并存储的一小块数据,它包含了特定的用户信息。当用户访问设置了Cookie的网站时,浏览器会自动...

    微信小程序cookie维护插件 实现自动设置获取cookie功能

    1. 考虑到微信小程序的安全限制,避免存储敏感信息在Cookie中,因为它们可能会被第三方获取。 2. 合理设置Cookie的生命周期,既不能太短导致频繁登录,也不能太长带来安全风险。 3. 在处理Cookie超时事件时,要确保...

    Cookie将用户名和密码加密后存在客户端的Cookie当中

    因此,在实际应用中还需要采取额外的安全措施,比如使用HTTPS协议、设置Cookie的`HttpOnly`属性以防止JavaScript脚本访问Cookie等。 #### 六、总结 通过在客户端的Cookie中存储加密后的用户名和密码,可以实现...

    jquery 设置cookie、删除cookie、获取cookie

    - **Cookie 的安全性**:在涉及到敏感数据时,考虑使用 HTTPS 协议并为 Cookie 添加 `secure` 属性,以提高安全性。 - **Cookie 数量限制**:浏览器对单个域名下的 Cookie 数量有限制(通常为 50 个),注意不要超过...

    cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击.zip_js设置cookie值

    在网络安全领域,Cookie是Web应用用来存储用户状态和信息的一种机制。然而,随着网络攻击手段的不断升级,Cookie的安全性也成为了关注的重点。XSS(Cross-Site Scripting,跨站脚本)攻击就是其中一种常见威胁,它...

    browser-cookie 获取浏览器cookie

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

    C#cookie实现历史记录

    - **安全性和加密**:默认情况下,Cookie的数据是明文传输的,可能存在安全风险。可以考虑对敏感信息进行加密后再存储在Cookie中。 - **SameSite属性**:为防止跨站请求伪造(CSRF)攻击,C# 4.5及以上版本支持...

    cookie cookie cookie cookie cookie cookie

    cookie cookie cookie cookie cookie cookie cookie cookie cookie cookie cookie cookie cookie cookie

Global site tag (gtag.js) - Google Analytics