`

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  
   

相关推荐

    python cookie反爬处理的实现

    Cookies的处理 作用 ...如果在请求的过程中产生了cookie,如果该请求使用session发起的,则cookie会被自动存储到session中. 案例 爬取雪球网中的新闻资讯数据:https://xueqiu.com/ #获取一个sessi

    官方标配:jquery-cookie包括Dome

    $.cookie('the_cookie'); // 获得cookie $.cookie('the_cookie', 'the_value'); // 设置cookie $.cookie('the_cookie', 'the_value', { expires: 7 }); //设置带时间的cookie $.cookie('the_cookie', '', { expires:...

    C#.net与vb.net中读写Cookie的方法

    创建Cookie方法 (1) Response.Cookies["userName"].Value = “admin"; Response.Cookies[“userName”].Expires = DateTime.Now.AddDays(1); //如果不设置失效时间,Cookie信息不会写到用户硬盘,浏览器关闭将会丢弃...

    利用Cookie实现十天免登录

    浏览器接收到来自服务器的Cookie数据之后默认将其保存在浏览器缓存中(如果浏览器关闭,缓存消失,Cookie数据消失),只要浏览器不关闭,当我们下一次发送“特定”请求的时候,浏览器负责将Cookie数据发送给WEB...

    PHP如何获取Cookie并实现模拟登录

    一、定义Cookie存储路径 必须使用绝对路径 $cookie_jar = dirname(__FILE__).”/pic.cookie”; 二、获取Cookie 将cookie存入文件 $url = "http://1.2.3.4/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $...

    Session Cookie的HttpOnly和secure属性

    如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 对于以上两个属性, 首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,...

    jQuery的Cookie插件 cookies

    jQuery的Cookie插件 cookies cookies 是一个强大的 jQuery 用来操作 Cookie 的插件。除了常见的操作 $.cookies.set( 'sessid', 'dh3tr62fghe' ); var sessid = $.cookies.get( 'sessid' ); $.cookies.del( 'sessid...

    cookie购物车cookie购物车cookie购物车

    cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车cookie购物车

    使用Cookie实现商品的浏览记录功能

    使用cookie机制实现商品的浏览历史记录功能 主要的实现思路就是通过每次点击商品查看信息的时候 传递一个商品编号 然后保存在cookie中 然后从cookie中取出来 去数据库执行相关的查询操作 之后再到页面上进行显示就ok...

    C#操作cookie,解密加密cookie

    C#操作cookie,解密加密cookie

    Cookie,Cookie的使用

    说起来,Cookie应该是一种应用较久的技术了。早在HTML刚刚出现的时候,在每个独立的页面之间没有办法记录和 标识不同的用户。后来人们就发明了Cookie技术,当用户访问网页时,它能够在访问者的机器上创立一个文件,...

    FlashCookie 不被浏览器清除的Cookie

    FlashCookie 不被浏览器清除的Cookie 不被浏览器清空的Cookie

    cookie读写,子cookie

    cookie读写工具类,子cookie读写工具类

    JavaScript数据存储 Cookie篇

    1.什么是cookie?  答:cookie是用于在客户端存储会话信息的。 2.cookie的组成部分?  ①名称:一个唯一确定cookie 的名称。建议区分大小写。cookie 的名称必须是经过URL 编码的。  ②值:储存在cookie 中的字符...

    jquery.cookie.js

    jquery.cookie.js 对cookie的操作 $.cookie('the_cookie'); //读取Cookie值 $.cookie('the_cookie', 'the_value'); //设置cookie的值 $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery...

    正确处理浏览器的甜点——Cookie保证上网安全

    Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递。服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的Cookie设置选择...

    jQuery插件Cookie操作jQuery.Cookie

    jQuery操作cookie的插件,大概的使用方法如下$.cookie('the_cookie'); //读取Cookie值$.cookie(’the_cookie’, ‘the_value’); //设置cookie的值$.cookie(’the_cookie’, ‘the_value’, {expires ‘/’, domain ...

    browser-cookie 获取浏览器cookie

    如何获取浏览器的cookie

    cookie设置插件jquery.cookie.min.js

    cookie设置插件jquery.cookie.min.js 文章《javascript设置cookie高级篇可跨域访问》https://blog.csdn.net/cplvfx/article/details/117822956

    官方jquery.cookie.js带demo

    jQuery cookie是个很好的cookie插件,大概的使用方法如下 example $.cookie(’name’, ‘value’); 设置cookie的值,把name变量的值设为value example $.cookie(’name’, ‘value’, {expires: 7, path: ‘/’, ...

Global site tag (gtag.js) - Google Analytics