简介
Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。Cookie包含每次用户访问站点时Web应用程序都可以读取的信息。因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分是不是来源于同一个浏览器。所以,需要额外的数据用于维护会话。Cookie正是这样的一段随HTTP请求一起被传递的额外数据。
Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及它会随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以,不适合保存重要的或者涉及隐私的内容。
分类
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。
内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
主要用途
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
相关设置
相关函数
PHP用SetCookie函数来设置Cookie。必须注意的一点是:Cookie是HTTP协议头的一部分,用于浏览器和服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用Cookie函数。SetCookie 函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下:int SetCookie(string name,string value,int expire,string path,string domain,int secure);
除了name之外所有的参数都是可选的。value,path,domain 三个参数可以用空字符串代换,表示没有设置;expire和 secure两个参数是数值型的,可以用0表示。expire参数是一个标准的Unix时间标记,可以用time()或mktime() 函数取得,以秒为单位。secure参数表示这个Cookie是否通过加密的HTTPS协议在网络上传输。当前设置的Cookie 不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原因。在同一个页面设置Cookie,实际是从后往前,所以如果要在插入一个新的Cookie之前删掉一个,你必须先写插入的语句,再写删除的语句,否则可能会出现不希望的结果。
使用举例
来看几个例子:
简单的:
SetCookie("MyCookie","Value of MyCookie");
带失效时间的:
SetCookie("WithExpire","Expire in 1 hour",time()+3600);//3600秒=1小时
什么都有的:
这里还有一点要说明的,比如你的站点有几个不同的目录,那么如果只用不带路径的Cookie的话,在一个目录下的页面里设的Cookie在另一个目录的页面里是看不到的,也就是说,Cookie是面向路径的。实际上,即使没有指定路径,WEB 服务器会自动传递当前的路径给浏览器的,指定路径会强制服务器使用设置的路径。解决这个问题的办法是在调用SetCookie时加上路径和域名,域名的格式可以是SetCookie函数里表示value的部分,在传递时会自动被encode,也就是说,如果value的值是“test value”在传递时就变成了“test%20value”,跟URL的方法一样。当然,对于程序来说这是透明的,因为在PHP接收Cookie的值时会自动将其decode。
如果要设置同名的多个Cookie,要用数组,方法是:
SetCookie("CookieArray[]","Value 1");
SetCookie("CookieArray[]","Value 2");
或
SetCookie("CookieArray[0]","Value 1");
SetCookie("CookieArray[1]","Value 2");
接收和处理Cookie
PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟FORM变量的原则一样,特别简单。比如设置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通变量一样的变量,名为$myCookie,这个变量的值就是Cookie的值。数组同样适用。
另外一个办法是引用PHP的全局变量$HTTP_COOKIE_VARS数组。
分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效)
echo $MyCookie
echo $CookieArray[0];
echo count($CookieArray);
echo $HTTP_COOKIE_VARS["MyCookie"];
就这么简单。
限制
大多数浏览器支持最大为4096字节的Cookie。由于这限制了Cookie的大小,所以只好用Cookie来存储少量数据,或者存储用户ID之类的标识符。用户ID随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。浏览器还限制站点可以在用户计算机上存储的Cookie的数量。大多数浏览器只允许每个站点存储20个Cookie;如果试图存储更多Cookie,则最旧的Cookie便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的Cookie总数作出绝对限制,通常为300个。
生存周期
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。
使用和禁用
用户可以改变浏览器的设置,以使用或者禁用Cookies。
GoogleChrome
“自定义和控制”(浏览器地址栏右侧的扳手图标) > 选项(设置) > 高级选项(显示高级设置)
通过cookie设置,更改cookie设置(隐私权说明 > 内容设置 > Cookie(允许站点存储本机数据 (建议)
Konqueror
如果没有设置cookie列表,请记住在域名前面加入“.”,例如.wikipedia.org,否则wikipedia将不会读取cookie(针对KDE 3.3)。
微软
工具 > Internet选项 > 隐私页调节滑块或者点击“高级”,进行设置。
MozillaFirefox
工具 > 选项 > 隐私(注:在Linux版本中,可能会是如下操作:编辑 > 属性 > 隐私, 而Mac则是:Firefox > 偏好 > 隐私)
设置Cookies选项
设定阻止/允许的各个域内Cookie
查看Cookies管理窗口,检查现存Cookie信息,选择删除或者阻止它们
Opera
按F12弹出一个菜单,从中可以快速设置允许或禁用cookie。
更多设置项目在 首选项 > 高级 > cookie
也可对不同域作不同的cookie设置。在网页空白处 按右键 > 编辑站点首选项 > cookie
苹果公司Safari
Safari > 预置 > 安全标签
选择以下的选项
总是 接受 Cookies
永不 接受 Cookies
接受 Cookies 仅从您浏览的站点(例如,不接受来自其它站点的广告)默认的选项
您可以显示所有驻留在您浏览器中的 cookies,也可随时将它们之一删除。
Cookies弊端
一些人反对cookies在网络中的应用,他们的理由如下:
识别不精确
如果在一台计算机中安装多个浏览器,每个浏览器都会以独立的空间存放cookie。因为cookie中不但可以确认用户,还能包含计算机和浏览器的信息,所以一个用户用不同的浏览器登录或者用不同的计算机登录,都会得到不同的cookie信息,另一方面,对于在同一台计算机上使用同一浏览器的多用户群,cookie不会区分他们的身份,除非他们使用不同的用户名登录。
隐私、安全和广告
Cookies在某种程度上说已经严重危及用户的隐私和安全。其中的一种方法是:一些公司的高层人员为了某种目的(譬如市场调研)而访问了从未去过的网站(通过搜索引擎查到的),而这些网站包含了一种叫做网页臭虫的图片,该图片透明,且只有一个象素大小(以便隐藏),它们的作用是将所有访问过此页面的计算机写入cookie。而后,电子商务网站将读取这些cookie信息,并寻找写入这些cookie的网站,随即发送包含了针对这个网站的相关产品广告的垃圾邮件给这些高级人员。
偷窃Cookies和脚本攻击
虽然cookies没有中电脑病毒那么危险,但它仍包含了一些敏感信息:用户名,电脑名,使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人信息的时候。
这并非危言耸听,跨站点脚本(Cross site scripting)可以达到此目的。在受到跨站点脚本攻击时,cookie盗贼和cookie毒药将窃取内容。一旦cookie落入攻击者手中,它将会重现其价值。
Cookie盗贼:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息通过合法手段进入用户帐户。
Cookie投毒:一般认为,Cookie在储存和传回服务器期间没有被修改过,而攻击者会在cookie送回服务器之前对其进行修改,达到自己的目的。例如,在一个购物网站的cookie中包含了顾客应付的款项,攻击者将该值改小,达到少付款的目的。这就是cookie投毒。
替代品
鉴于cookie的局限和反对者的声音,有如下一些替代方法:
Brownie方案,是一项开放源代码工程,由SourceForge发起。Brownie曾被用以共享在不同域中的接入,而cookies则被构想成单一域中的接入。这项方案已经停止开发。
p3p,用以让用户获得更多控制个人隐私权利的协议。在浏览网站时,它类似于cookie。
在与服务器传输数据时,通过在地址后面添加唯一查询串,让服务器识别是否合法用户,也可以避免使用cookie。
隐私泄漏
跨站Cookie
实际上,Cookie中保存的用户名、密码等个人敏感信息通常经过加密,很难将其反向破解。但这并不意味着绝对安全,黑客可通过木马病毒盗取用户浏览器Cookie,直接通过偷取的Cookie骗取网站信任。可以看出,木马病毒入侵用户电脑是导致用户个人信息泄露的一大元凶。
自1993年Cookie诞生以来,其就拥有专属性原则,即A网站存放在Cookie中的用户信息,B网站是没有权限直接获取的。但是,一些第三方广告联盟的代码使用范围很广。这就造成用户在A网站搜索了一个关键字,用户继续访问B网站,由于B网站也使用了同一家的第三方广告代码,这个代码可以从Cookie中获取用户在A网站的搜索行为,进而展示更精准的推广广告。比如搜索“糖尿病”等关键词,再访问其联盟网站,页面会立刻出现糖尿病治疗广告。如果并未事先告之,经用户同意,此做法有对隐私构成侵犯的嫌疑。这个还处在灰色地带。
因此,跨站Cookie恰恰就是用户隐私泄露的罪魁祸首,所以限制网站使用跨站Cookie,给用户提供禁止跟踪(DNT)功能选项已成为当务之急。据了解,IE、Chrome、360、搜狗等浏览器均可以快速清除用户浏览器网页的Cookie信息。但从整体的隐私安全保护环境来看,安全软件仍然存在着巨大的防护缺口。所以安全软件也可以并且有必要提供定期清理网站Cookie,并监测跨站Cookie使用的功能,保护用户隐私安全。
超级Cookies
英国伦敦的一名软件开发者已发现了一串代码,能在浏览器的隐私模式中执行普通会话,这将导致隐私模式的失效。
目前,所有主流浏览器都提供了隐私保护模式。在这种模式下,网站的Cookies无法追踪用户身份。例如,谷歌Chrome浏览器提供了名为“Incognito”的功能,而火狐浏览器则提供了“隐私窗口”功能。
不过,新发现的这一漏洞将导致浏览器隐私模式的失效。例如,当用户使用普通浏览器,在亚马逊网站上购物或浏览Facebook时,用户可能会启动一个隐私窗口,去浏览存在争议内容的博客。如果这一博客使用了与亚马逊同样的广告网络,或是集成了Facebook的“点赞”按钮,那么广告主和Facebook可以知道,用户在访问亚马逊和Facebook的同时也访问了这一争议博客。
对于这一漏洞,用户有一个临时解决办法,但是比较麻烦:用户可以在启动隐私模式之前删除所有Cookies文件,或者使用一个专门的浏览器,完全在隐私模式下进行浏览。讽刺的是,这一漏洞是由于一项旨在加强隐私保护的功能所引起的。
如果用户在浏览器地址栏使用前缀https://,为某些网站的通信加密,那么一些浏览器会对此进行记忆。浏览器会保存一个“超级Cookie”,从而确保当用户下次连接该网站时,浏览器会自动进入https通道。即使用户启用了隐私模式,这一记忆仍会存在。
与此同时,这样的超级Cookie也允许第三方网络程序,例如广告和社交媒体按钮,对用户进行记忆。
发现这一漏洞的独立研究员萨姆·格林哈尔(Sam Greenhelgh)在博客中表示,这种功能还没有被任何公司所使用。不过在这种方式被公开之后,没有任何办法去阻止各家公司这样做。
在线隐私软件公司Abine联合创始人尤金·库兹涅佐夫(Eugene Kuznetsov)认为,这种“超级Cookie”将成为下一代追踪工具。这种工具脱胎于Cookies,但变得更加复杂。目前,用户在浏览过程中总是会存在设备唯一识别码,以及具有唯一性的浏览器指纹,这些痕迹很难被擦除。
由于“超级Cookie”的存在,互联网匿名性变得更加困难。库兹涅佐夫表示:“我们已经看到了关于隐私保护的军备竞赛。追踪互联网用户的愿望就像是寄生虫。你浏览器中的任何内容都在被网站和广告主审视,从而实现更多的追踪。”Mozilla已经在最新版火狐浏览器中对此进行了修复,而谷歌则倾向于使Chrome维持原状。谷歌已经知道了“超级Cookie”带来的问题,但仍选择继续启用Chrome的https记忆功能。在安全性和隐私保护之间,谷歌选择了前者。
微软IE浏览器并不存在这样的问题,因为这款浏览器并未内建https记忆功能。格林哈尔还表示,在iOS设备上,“超级Cookie”带来的问题同样存在。
央视315曝光
2013年3月15日晚,央视315在行动晚会曝光了网易同意第三方公司加代码,获取用户cookie信息,追踪用户上网行为。在央视315晚会上,“Cookie跟踪泄漏隐私”被当成惊世骇俗的侵权行为。报道称,为了对广告效果进行监测,一些网站的确同意第三方公司加代码。第三方公司通过植入代码、获取cookie,就可以锁定用户,精准投放广告。