Cookie详解整理

1.Cookie的诞生web

因为HTTP协议是无状态的,而服务器端的业务必须是要有状态的。Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。好比判断用户是不是第一次访问网站。目前最新的规范是RFC 6265,它是一个由浏览器服务器共同协做实现的规范。数据库

2.Cookie的处理分为:
1.服务器像客户端发送cookie
2.浏览器将cookie保存
3以后每次http请求浏览器都会将cookie发送给服务器端,服务器端的发送与解析

浏览器

3.发送cookie
服务器端像客户端发送Cookie是经过HTTP响应报文实现的,在Set-Cookie中设置须要像客户端发送的cookie,cookie格式以下:安全

Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure"服务器

其中name=value是必选项,其它都是可选项。Cookie的主要构成以下:cookie

name:一个惟一肯定的cookie名称。一般来说cookie的名称是不区分大小写的。
value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码
domain:cookie对于哪一个域是有效的。全部向该域发送的请求中都会包含这个cookie信息。并发

这个值能够包含子域(如:xx.xxx.com),也能够不包含它(如:.xxx.com,则对于aliyun.com的全部子域都有效).
path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
expires:失效时间,表示cookie什么时候应该被删除的时间戳(也就是,什么时候应该中止向服务器发送这个cookie)。若是不设置这个时间戳,浏览器会在页面关闭时即将删除全部cookie;不过也能够本身设置删除时间。这个值是GMT时间格式,若是客户端和服务器端时间不一致,使用expires就会存在误差。
max-age: 与expires做用相同,用来告诉浏览器此cookie多久过时(单位是秒),而不是一个固定的时间点。正常状况下,max-age的优先级高于expires。
HttpOnly: 告知浏览器不容许经过脚本document.cookie去更改这个值,一样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置一般在服务器端设置。
secure: 安全标志,指定后,只有在使用SSL连接时候才能发送到服务器,若是是http连接则不会传递该信息。就算设置了secure 属性也并不表明他人不能看到你机器本地保存的 cookie 信息,因此不要把重要信息放cookie就对了服务器端设置dom

 

4.cookie分类:
Cookie老是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。
当cookie没有设置expires或者设置为0时,就造成了内存Cookie,内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。网站

硬盘Cookie保存在硬盘里,有一个过时时间,除非用户手工清理或到了过时时间,硬盘Cookie不会被删除,其存在时间是长期的。
因此,按存在时间,可分为非持久Cookie和持久Cookie。编码

 

5.Cookie的缺陷:

Cookie会被附加在每一个HTTP请求中,因此无形中增长了流量。
因为在HTTP请求中的Cookie是明文传递的,因此安全性成问题。(除非用HTTPS)
Cookie的大小限制在4KB左右。对于复杂的存储需求来讲是不够用的

用户能够改变浏览器的设置,以使用Cookies。
若是在一台计算机中安装多个浏览器,每一个浏览器都会以独立的空间存放Cookie。由于Cookie中不但能够确认用户信息,还能包含计算机和浏览器的信息,因此一个用户使用不一样的浏览器登陆或者用不一样的计算机登陆,都会获得不一样的Cookie信息,另外一方面,对于在同一台计算机上使用同一浏览器的多用户群,Cookie不会区分他们的身份,除非他们使用不一样的用户名登陆。

 

6.脚本攻击:

尽管cookie没有病毒那么危险,但它仍包含了一些敏感信息:用户名,计算机名,使用的浏览器和曾经访问的网站。用户不但愿这些内容泄漏出去,尤为是当其中还包含有私人信息的时候。
这并不是危言耸听,一种名为跨站点脚本攻击(Cross site scripting)能够达到此目的。一般跨站点脚本攻击每每利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的全部 Cookie 内容(已不存在 Cookie 做用域限制),而后经过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。

 

7.建议开发人员在向客户端 Cookie 输出敏感的内容时(譬如:该内容能识别用户身份):
1)设置该 Cookie 不能被脚本读取,这样在必定程度上解决上述问题。
2)对 Cookie 内容进行加密,在加密前嵌入时间戳,保证每次加密后的密文都不同(而且能够防止消息重放)。
3)客户端请求时,每次或定时更新 Cookie 内容(即:基于第2小条,从新加密)
4)每次向 Cookie 写入时间戳,数据库须要记录最后一次时间戳(防止 Cookie 篡改,或重放攻击)。
5)客户端提交 Cookie 时,先解密而后校验时间戳,时间戳若小于数据数据库中记录,即意味发生攻击。

基于上述建议,即便 Cookie 被窃取,却因 Cookie 被随机更新,且内容无规律性,攻击者没法加以利用。另外利用了时间戳另外一大好处就是防止 Cookie 篡改或重放。Cookie 窃取:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息经过合法手段进入用户账户。Cookie 篡改:利用安全机制,攻击者加入代码从而改写 Cookie 内容,以便持续攻击。

相关文章
相关标签/搜索