首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。
1、 简单说明
http cookie是通过客户端传送数据的一种常用机制。和隐藏表单字段一样,http cookie一般并不显示在屏幕上。相比url参数的方式,貌似很多普通用户也不知道http cookie在那里,看起来安全性要强不少。
与此同时,很多开发人员也不知道cookie在那里,虽然我们经常用。
一个cookie就是存储在用户主机浏览器中的一小段文本文件。Cookies是纯文本形式,它们不包含任何可执行代码。一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。Web服务器之后可以利用这些信息来标识用户。多数需要登录的站点通常会在你的认证信息通过后来设置一个cookie,之后只要这个cookie存在并且合法,你就可以自由的浏览这个站点的所有部分。再次,cookie只是包含了数据,就其本身而言并不有害。
2、 创建cookie:
通过HTTP的Set-Cookie消息头,Web服务器可以指定存储一个cookie。Set-Cookie消息的格式如下面的字符串(中括号中的部分都是可选的)
Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]
消息头的第一部分,value部分,通常是一个name=value格式的字符串。事实上,原始手册指示这是应该使用的格式,但是浏览器对cookie的所有值并不会按此格式校验。实际上,你可以指定一个不包含等号的字符串并且它同样会被存储。然而,通常性的使用方式是以name=value的格式(并且多数的接口只支持该格式)来指定cookie的值。
当一个cookie存在,并且可选条件允许的话,该cookie的值会在接下来的每个请求中被发送至服务器。cookie的值被存储在名为Cookie的HTTP消息头中,并且只包含了cookie的值,其它的选项全部被去除。
通过Set-Cookie指定的选项只是应用于浏览器端,一旦选项被设置后便不会被服务器重新取回。cookie的值与Set-Cookie中指定的值是完全一样的字符串;对于这些值不会有更近一步的解析或转码操作。如果在指定的请求中有多个cookies,那么它们会被分号和空格分开。
expires选项,其指定了cookie何时不会再被发送到服务器端的,因此该cookie可能会被浏览器删掉。该选项所对应的值是一个格式为Wdy,DD-Mon–YYYY HH:MM:SS GMT的值。
没有expires选项的时候,cookie的寿命仅限于单一的会话中。浏览器的关闭意味这一次会话的结束,所以会话cookie只存在于浏览器保持打开的状态之下。这就是为什么当你登录到一个web应用时经常看到一个checkbox,询问你是否选择存储你的登录信息:如果你选择是的话,那么一个expires选项会被附加到登录的cookie中。如果expires选项设置了一个过去的时间点,那么这个cookie会被立即删除。
这个属性对安全来说很重要,是除了cookie内容之外最重要的一个属性。
3、 不安全的cookie表现形式
不安全的cookie表现形式非常简单,明码的和弱加密的cookie。
随着时代的发展,大家为了追求更加友好的用户体验,cookie的使用我个人感觉越来越多。比如在很多的网站都使用了默认登陆等,这些都是通过cookie来实现的。
4、 被攻击
明码的和弱加密的cookie非常容易被攻击。
另外一种攻击方法,把一个高权限用户的长期cookie,替换一个低权限用户的cookie。这样这个低权限用户就拥有了高权限用户的部分权限。
如果在系统内部没有合适的二次验证(现在很多主流网站,都有登录密码和支付密码,登陆密码可以保持在cookie中,如果没有支付密码….)
cookie信息非常容易被偷天换日。