Cookie详解整理

1.Cookie的诞生

由于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的主要构成如下:

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就对了服务器端设置

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 内容,以便持续攻击。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 18.04上安装和配置GitLab

GitLab CE或Community Edition是一个开源应用程序,主要用于托管Git存储库,以及其他与开发相关的功能,如问题跟踪。它旨在使用您自己的基础...

3.6K10
来自专栏技术博文

linux创建目录mkdir命令(5)

linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。 1.命令格式: m...

43890
来自专栏张戈的专栏

Linux:10个实用的网络和监控命令

本文列出了 10 个基础的每个 Linux 用户都应该知道的网络和监控命令。网络和监控命令类似于这些: hostname, ping, ifconfig, iw...

45130
来自专栏测试驿栈

JProfiler简明使用教程

 JProfile是一款性能瓶颈分析工具,监控粒度可以细化到某一个类包,堪称神器!我安装了一下9.11的版本,并简单说说使用方法。

2.4K40
来自专栏架构师之路

进程内缓存,究竟怎么玩?

除了常见的redis/memcache等进程外缓存服务,缓存还有一种常见的玩法,进程内缓存。

18230
来自专栏Ryan Miao

linux centos中添加删除修改环境变量,设置java环境变量

前言 安装完软件必要添加环境变量。指令很少,然而长时间不写就会不自信:我写的对吗?于是百度开始,于是发现又是各有千秋。好吧,好记星不如烂笔头。当然,最重要的是,...

41560
来自专栏运维小白

14.3 NFS配置选项

NFS配置选项 rw 读写 ro 只读 sync 同步模式,内存数据实时写入磁盘,相应的就会降低磁盘效率 async 非同步模式,它会每隔一段时间才会将数据刷新...

24560
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装Node.js

Node.js是一个用于通用编程的JavaScript平台,允许用户快速构建网络应用程序。通过在前端和后端利用JavaScript,开发可以更加一致并在同一系统...

1.2K60
来自专栏linux驱动个人学习

高通GPIO驱动(DTS方式)

gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态; ...

62340
来自专栏http://www.cnblogs.com

centos7安装部署gitlab服务器

我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreutils...

622100

扫码关注云+社区

领取腾讯云代金券