cookie使用安全

Cookie使用安全


目录
1 COOKIE简介 1
1.1 什么是COOKIE 1
1.2 COOKIE可以做什么 1
1.3 COOKIE的限制 1
2 COOKIE常用属性 2
2.1 COOKIE常用属性 2
3 COOKIE安全设置 2
3.1 COOKIE加密 3
3.2 COOKIE域(DOMAIN)与路径(PATH)设置 3
3.3 COOKIE的HTTPONLY和SECURE设置 4



1 Cookie简介
1.1 什么是Cookie
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
什么是Cookies(“小甜饼”)呢?简单来说,Cookies就是服务器暂存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机。Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。

1.2 Cookie可以做什么
cookies有什么作用呢?现在上许多网站都用新用户注册这一项,有时注册了一下,等到下次再访问该站点时,会自动识别到你,并且向你问好,是不是觉得 很亲切?当然这种作用只是表面现象,更重要的是,网站可以利用cookies跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网 页的停留时间等。利用这些信息,一方面是可以为用户提供个性化的服务,
另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。例如,你在某家航空公司站点查阅航班时刻表,该网站可能就创建了包含你旅行计划的Cookies,也可能它只记录了你在该站点上曾经访问过的Web 页,在你下次访问时,网站根据你的情况对显示的内容进行调整,将你所感兴趣的内容放在前列。这是高级的Cookie应用。目前Cookies 最广泛的是记录用户登录信息,这样下次访问时可以不需要输入自己的用户名、密码了——当然这种方便也存在用户信息泄密的问题,尤其在多个用户共用一台电脑 时很容易出现这样的问题。

1.3 Cookie的限制
Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会随着每次请求被发送到服务器,所以应该保证它不要太大,大多数浏览器支持最大为 4kC。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。
浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个域存储 20 个 Cookie;大多数浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。

2 Cookie常用属性
2.1 Cookie常用属性
一个Cookie包含以下信息:
• Cookie名称,Cookie名称必须使用只能用在URL中的字符,一般用字母及数字,不能包含特殊字符,如有特殊字符想要转码。如js操作cookie的时候可以使用escape()对名称转码。
• Cookie值,Cookie值同理Cookie的名称,可以进行转码和加密。
• Expires,过期日期,一个GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器关闭后消失。
• Path,一个路径,在这个路径下面的页面才可以访问该Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。
• Domain,子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com。如果没有设置cookie的domain值,该属性的默认值就是创建cookie的网页所在的服务器的主机名。注意,不能将一个cookie的域设置成服务器所在的域之外的域。
• Secure,安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问,如果设置了Secure(没有值),则只有当使用https协议连接时cookie才可以被页面访问。
• HttpOnly,如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息。

3 Cookie安全设置
在实际的应用场景中,Cookie被用来做得最多的一件事是保持身份认证的服务端状态。这种保持可能是基于会话(Session)的,也有可能是持 久性的。不管哪一种,身份认证Cookie中包含的服务端票据(Ticket)一旦泄露,那么服务端将很难区分带有此票据的用户请求是来自于真实的用户, 或者是来自恶意的攻击者。在实际案例中,造成Cookie泄露最多的途径,是通过跨站脚本(XSS, Cross Site Script)漏洞。攻击者可以通过一小段JavaScript代码,偷窃到代表用户身份的重要的Cookie标示。由于跨站脚本漏洞是如此的普遍(不要 以为简单的HTML Encode就可以避免被跨站,跨站是一门很深的学问,以至于在业界衍生出一个专用的名词:跨站师),几乎每一个网站都无法避免,所以这种方式是实际攻防中被普遍使用的一种手段。如CSRF(跨站请求伪造)攻击和XSS(跨站脚本)攻击都可能利用Cookie来攻击我们的网站。
了解CSRF和XSS攻击可以访问下面地址
CSRF跨域请求伪造攻击:http://xmong.iteye.com/blog/1564261
XSS跨站攻击:http://xmong.iteye.com/blog/1565910

Cookie往往会成为黑客攻击web应用的切入点,所以我们在使用cookie的时候一定要谨慎小心。下面是使用cookie时候的一些安全考虑。
1. 使用cookie存储信息是明文存储吗,有没有对存储信息加密存储?怎样加密和解密策略?
2. 怎样设置cookie的domain(域)和path(路径),有什么策略?特别是有多个web应用的时候?
3. 怎样操作cookie,是使用js(前端)还是使用java(后台)操作cookie?如果有js操作cookie,这是必须的吗,如果没有,js能访问cookie吗?
4. 在有SSL的应用中,你的Cookie是否可以在HTTP请求和HTTPS请求中通用?

3.1 Cookie加密
加密的方法很多,使用比较复杂的加密算法,安全性比较高些,但占用服务器资源比较大,会减慢整个网站的访问速度。
所以对Cookie加密在考虑三个方面:
1:安全性,2:Cookie容量,3:整个网站的性能

3.2 Cookie域(domain)与路径(path)设置
domain表示的是cookie所在的域,默认为请求的地址,如网址为www.test.com/test/test.jsp,那么domain默认为www.test.com。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的 cookie,就要将该cookie的domain设置为test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该 cookie的domain设置为t2.test.com。
path表示的是cookie所在的目录,默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/t1/,/test /t2/,现设一个cookie的path为/test,那么在请求 /test/,/test/t1/,/test /t2/ 时,都能访问cookie,如果将cookie的path设置为/test/t1,在请求/test/,/test/t1/,/test /t2/ 时,只有/test/t1/能访问到cookie。

Cookie在设置域(domain)和路径(path)时,有一个原则:最小授权原则。

浏览器在选择发送哪些本地Cookie到本次请求的服务端时,有一系列的比较和甄别。这些甄别中最重要的部分是Domain和Path的吻合。 Domain形如test.com的Cookie,会被发送给所有test.com在80端口上的子域请求。但是反之则不行,这就是Cookie的域匹配 (domain match)原则。
在一个大型Web站点中,往往有多个应用,生存在不同的子域名或路径下。这些应用之间由于共享同一个域名,所以往往可能会彼此有操作对方应用 Cookie的能力。这种情况下,设计好Cookie的Domain和Path尤为重要。在实际设计工作中,最重要的一个安全原则就是:最小化授权。这意 味着,你需要将自己的Cookie可被访问到的范围降至最低。应用之间传递数据和共享信息的解决方案非常多,而通过Cookie这种用户输入(User input)来共享数据,是最不安全的解决方案之一。

3.3 Cookie的HttpOnly和secure设置
(1)HttpOnly属性
如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
(2)secure属性
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被盗取到Cookie 的具体内容。
对于以上两个属性,
secure属性是防止信息在传递的过程中被监听捕获后信息泄漏。
HttpOnly属性的目的是防止程序获取cookie后进行攻击。
对于HttpOnly属性Tomcat6,GlassFish2.x只支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。Tomcat7,GlashFish3.0(支持 servlet3.0)默认开启Session Cookie的HttpOnly属性。



******************************

未完待续
参考:
cookie安全漫谈
js操作cookie




猜你喜欢

转载自xmong.iteye.com/blog/1566102
今日推荐