首页 > 代码库 > cookie (储存在用户本地终端上的数据)

cookie (储存在用户本地终端上的数据)

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265[1]  。(可以叫做浏览器缓存)
 
中文名
储存在用户本地终端上的数据
外文名
Cookie
复数形式
Cookies

目录

  1. 技术简介
  2. 功能特点
  3. 具体含义
  4. 诞生时间
  5. 主要用途
  6. 生存周期
  7. 识别功能
  1. 脚本攻击
  2. 相关问题
  3. 10 设置Cookie的方法
  4. 相关函数
  5. 使用举例
  6. 11 导出Cookie的方法
  1. 12 删除Cookie的方法
  2. IE浏览器
  3. flash
  4. 13 PHP Cookies
  5. 创建 Cookie
  6. 取回 Cookie 值
  7. 删除 Cookie
  8. 14 JavaScript Cookies
  1. 15 JspCookie
  2. 16 替代品
  3. 17 隐私泄漏
  4. 跨站Cookie
  5. 超级Cookies
基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的一些信息;论坛作为 Internet发展的产物之一,在 Internet 中发挥着越来越重要的作用,是用户获取、交流、传递信息的主要场所之一,论坛常常也需要记录访问者的一些基本信息(如身份识别号码、密码、用户在 Web 站点购物的方式或用户访问该站点的次数)。目前公认的是,通过 Cookie 和 Session 技术来实现记录访问者的一些基本信息[2]  。
Cookie 技术诞生以来,它就成了广大网络用户和 Web 开发人员争论的一个焦点。有一些网络用户,甚至包括一些资深的 Web 专家也对它的产生和推广感到不满,这并不是因为 Cookie 技术的功能太弱或其他技术性能上的原因,而是因为 Cookie 的使用对网络用户的隐私构成了危害。因为 Cookie 是由 Web 服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息[2]  。
Cookie 技术产生源于 HTTP 协议在互联网上的急速发展。随着互联网的深层次发展,带宽等限制不存在了,人们需要更复杂的互联网交互活动,就必须同服务器保持活动状态。于是,在浏览器发展初期,为了适应用户的需求,技术上推出了各种保持 Web 浏览状态的手段,其中就包括了 Cookie 技术。1993 年,网景公司雇员 Lou Montulli 为了让用户在访问某网站时,进一步提高访问速度,同时也为了进一步实现个人化网络,发明了今天广泛使用的 Cookie[3]  。
Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是通过访问主机中的一个文件来实现的,这个文件就是 Cookie。在 Internet 中,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理[3]  。
Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称作 Persistent Cookies)[3]  。
通常情况下,当用户结束浏览器会话时,系统将终止所有的 Cookie。当 Web 服务器创建了Cookies 后,只要在其有效期内,当用户访问同一个 Web 服务器时,浏览器首先要检查本地的Cookies,并将其原样发送给 Web 服务器。这种状态信息称作“Persistent Client State HTTP Cookie” ,简称为 Cookies[3]  。

技术简介

编辑
Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息[2]  。
目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除[2]  。
持续的 Cookie 则保存在用户的 Cookie 文件中,下一次用户返回时,仍然可以对它进行调用。在 Cookie 文件中保存 Cookie,有些用户担心 Cookie 中的用户信息被一些别有用心的人窃取,而造成一定的损害。其实,网站以外的用户无法跨过网站来获得 Cookie 信息。如果因为这种担心而屏蔽 Cookie,肯定会因此拒绝访问许多站点页面。因为,当今有许多 Web 站点开发人员使用 Cookie 技术,例如 Session 对象的使用就离不开 Cookie 的支持[2]  。

功能特点

编辑
在同一个页面中设置 Cookie,实际上是按从后往前的顺序进行的。如果要先删除一个 Cookie,再写入一个 Cookie,则必须先写写入语句,再写删除语句,否则会出现错误[2]  。
Cookie是面向路径的。缺省路径 (path) 属性时,Web 服务器页会自动传递当前路径给浏览器,指定路径强制服务器使用设置的路径。在一个目录页面里设置的 Cookie 在另一个目录的页面里是看不到的 [2]  。
Cookie 必须在 HTML 文件的内容输出之前设置;不同的浏览器 (Netscape Navigator、Internet Explorer) 对 Cookie 的处理不一致,使用时一定要考虑;客户端用户如果设置禁止 Cookie,则 Cookie 不能建立。 并且在客户端,一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie 总数不能超过 20 个[2]  。

具体含义

编辑
Cookie 历来指就着牛奶一起吃的点心。然而,在因特网内,“Cookie”这个字有了完全不同的意思。那么“Cookie”到底是什么呢?“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。当访客结束其浏览器对话时,即终止的所有 Cookie。

诞生时间

编辑
技术分享使用cookie实现单点登录
Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。[4] 
Cookie的安全级别包括组织所用Cookie,接受所有Cookie,中级,和高级

主要用途

编辑
技术分享c#中的cookie编程
务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
使用和禁用Cookie
用户可以改变浏览器的设置,以使用或者禁用Cookies。
微软Internet Explorer
工具 > Internet选项 > 隐私页
调节滑块或者点击“高级”,进行设置.
Mozilla Firefox
工具>选项>隐私
(注: 在Linux版本中,是如下操作:编辑 > 首选项 > 隐私 , 而Mac则是:Firefox > 属性 > 隐私)
技术分享查看源网页
设置Cookies选项
设定阻止/允许的各个域内Cookie
查看Cookies管理窗口,检查现存Cookie信息,选择删除或者阻止它们
苹果计算机 Safari
Safari > 预置 > 安全标签
选择以下的选项
总是 接受 Cookies
永不 接受 Cookies
接受 Cookies 仅从您浏览的站点 (例如,不接受来自其它站点的广告) 预设的选项.
您可以显示所有驻留在您浏览器中的 cookies,也可随时将它们之一删除。
NETSCAPE
技术分享查看源网页
“PREFERENCE\ADVANCED\COOKIES”,在出现的窗口中有三个选项,选择“DISABLECOOKIES”即可关闭COOKIE。在IE中,选择“查看”/“INTERNET选项”/“高级",在随后出现的窗口中找到“COOKIES”一项,选择“禁止所有的COOKIE 使用”可关闭COOKIE。
Konqueror
如果没有设置cookie列表,请记住在域名前面加入“.”,例如.,否则百度将不会读取cookie(针对KDE 3.3)。
Cookies就是服务器暂存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机,本文简单介绍什么是cookies,cookies有什么作用,以及网站利用cookie存在什么问题。
什么是Cookies(“小甜饼”)呢?简单来说,Cookies就是服务器暂时存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookies 会把你在网站上所打的文字或是一些选择都记录下来。当下次你再访问同一个网站,Web服务器会先看看有没有它上次留下的Cookies资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。
cookies有什么作用呢?许多网站上都有新用户注册这一项,有时注册了一下,等到下次再访问该站点时,会自动识别到你,并且向你问好,是不是觉得很亲切?当然这种作用只是表面现象,更重要的是,网站可以利用cookies跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化的服务,另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。例如,你在某家航空公司站点查阅航班时刻表,该网站可能就创建了包含你旅行计划的Cookies,也可能它只记录了你在该站点上曾经访问过的Web页,在你下次访问时,网站根据你的情况对显示的内容进行调整,将你所感兴趣的内容放在前列。这是高级的Cookie应用。目前Cookies 最广泛的是记录用户登录信息,这样下次访问时可以不需要输入自己的用户名、密码了——当然这种方便也存在用户信息泄密的问题,尤其在多个用户共用一台电脑时很容易出现这样的问题。
另外,有人认为网站利用cookies可能存在侵犯用户隐私的问题,但由于大多用户对此了解不多,而且这种对用户个人信息的利用多数作为统计数据之用,不一定造成用户的直接损失,因此对于cookies与用户隐私权的问题并没有相关法律约束,很多网站仍然在利用cookie跟踪用户行为,有些程序要求用户必须开启cookie才能正常应用。IE浏览器用户可以通过“隐私”选项中的隐私设置的高低来决定是否允许网站利用cookie跟踪自己的信息,从全部限制到全部允许,或者限制部分网站,也可以通过手动方式对具体的网站设置允许或者禁止使用cookies进行编辑。IE浏览器的默认设置是 “中级”-对部分网站利用cookie有限制。个人电脑的cookies设置(对IE浏览器而言)可通过菜单“工具-Internet选项-隐私”来查看和修改。

生存周期

编辑
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。

识别功能

编辑
如果
技术分享c#中的cookie编程
在一台计算机中安装多个浏览器,每个浏览器都会在各自独立的空间存放cookie。因为cookie中不但可以确认用户,还能包含计算机和浏览器的信息,所以一个用户用不同的浏览器登录或者用不同的计算机登录,都会得到不同的cookie信息,另一方面,对于在同一台计算机上使用同一浏览器的多用户群,cookie不会区分他们的身份,除非他们使用不同的用户名登录。
反对cookies者
一些人反对cookie在网络中的应用,他们的理由如下:
1、识别不精确
参见上面的识别功能。
2、隐私,安全和广告
Cookies在某种程度上说已经严重危及用户的隐私和安全。其中的一种方法是:一些公司的高层人员为了某种目的(譬如市场调研)而访问了从未去过的网站(通过搜索引擎查到的),而这些网站包含了一种叫做网页臭虫的图片,该图片透明,且只有一个像素大小(以便隐藏),它们的作用是将所有访问过此页面的计算机写入cookie。而后,电子商务网站将读取这些cookie信息,并寻找写入这些cookie的网站,随即发送包含了针对这个网站的相关产品广告的垃圾邮件给这些高级人员。
因为更具有针对性,使得这套系统行之有效,收到邮件的客户或多或少表现出对产品的兴趣。这些站点一旦写入cookie并使其运作,就可以从电子商务网站那里获得报酬,以维系网站的生存。
鉴于隐藏的危害性,瑞典已经通过对cookie立法,要求利用cookie的网站必须说明cookie的属性,并且指导用户如何禁用cookie。

脚本攻击

编辑
尽管cookie没有病毒那么危险,但它仍包含了一些敏感信息:用户名,计算机名,使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人信息的时候。
这并非危言耸听,一种名为跨站点脚本攻击(Cross site scripting)可以达到此目的。通常跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有 Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。
建议开发人员在向客户端 Cookie 输出敏感的内容时(譬如:该内容能识别用户身份):
1)设置该 Cookie 不能被脚本读取,这样在一定程度上解决上述问题。
  2)对 Cookie 内容进行加密,在加密前嵌入时间戳,保证每次加密后的密文都不一样(并且可以防止消息重放)。
  3)客户端请求时,每次或定时更新 Cookie 内容(即:基于第2小条,重新加密)
  4)每次向 Cookie 写入时间戳,数据库需要记录最后一次时间戳(防止 Cookie 篡改,或重放攻击)。
  5)客户端提交 Cookie 时,先解密然后校验时间戳,时间戳若小于数据数据库中记录,即意味发生攻击。
基于上述建议,即使 Cookie 被窃取,却因 Cookie 被随机更新,且内容无规律性,攻击者无法加以利用。另外利用了时间戳另一大好处就是防止 Cookie 篡改或重放。
Cookie 窃取:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息通过合法手段进入用户帐户。
Cookie 篡改:利用安全机制,攻击者加入代码从而改写 Cookie 内容,以便持续攻击。

相关问题

编辑
Cookie 有哪些用途?
Cookie 的用途之一是存储用户在特定网站上的密码和 ID。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求你的网络浏览器利用你计算机硬驱上的少量空间来储存这些首选项。这样,每次你登录该网站时,你的浏览器将检查你是否就该唯一的服务器有任何预先定义的首选项(cookie)。如果有的话,浏览器将此 cookie 随你对网页的请求一起发送给服务器。Microsoft 和 Netscape 使用 cookie 在其网站上创建个人起始页。各家公司利用 cookie 的一般用途包括:在线定货系统、网站个人化和网站跟踪。
网站个人化是 cookie 最有益的用途之一。例如,当谁来到 CNN 网站,但并不想查看任何商务新闻。网站允许他将该项选为关闭选项。从那时起(或者直到 cookie 逾期),他在访问 CNN 网页时将不会读到商务新闻。
这些 Cookie 是如何起作用的?
文档的 HTML 代码中的命令行告诉浏览器设置某一名称或数值的 cookie。以下是用来设置 cookie脚本的一个普通实例。
Set-Cookie: name = VALUE;
expires = DATE;
path = PATH;
domain = DOMAIN_NAME;
那么安全性如何?HTTP Cookie 不能用来从阁下的硬驱上检索个人数据、放置病毒、得到阁下的电子邮件地址或偷窃有关阁下身份的敏感信息;然而,HTTP Cookie 可用来跟踪阁下在特定网站上的所到之处。不使用 cookie 就很难进行网站跟踪。
至于其他一切与因特网有关的事,如同阁下所希望的那样是匿名的。没有网站知道阁下是谁,除非阁下自己透露给网站。同时,cookie 只是为了更好地了解使用模式并改进网站访客的效率而采用的一个网站跟踪统计手段而已。
如果网站设计师旨在使网页能与访客更具互动作用,或者若设计师计划让访客自定义网站的外观,则就需要使用 cookie。而且,如果阁下想要网站在某些情况下改变其外观,cookie 则提供了一条快速、容易的途径,让阁下的 HTML 页面按需要而改变。最新型的服务器使用 cookie 有助于数据库的互动性,进而改进网站的整体互动性。
简介
适用对象:初级读者
Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。你可以在IE的“工具/Internet选项”的“常规”选项卡中,选择“设置/查看文件”,查看所有保存到你电脑里的Cookie。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。如果你使用NetsCape浏览器,则存放在“C:\PROGRAMFILES\NETSCAPE\USERS\”里面,与IE不同的是,NETSCAPE是使用一个Cookie 文件记录所有网站的Cookies。
为了保证上网安全我们需要对Cookie进行适当设置。打开“工具/Internet选项”中的“隐私”选项卡(注意该设置只在IE6.0中存在,其他版本IE可以在“工具/Internet选项”的“安全”标签中单击“自定义级别”按钮,进行简单调整),调整Cookie的安全级别。通常情况,可以将滑块调整到“中高”或者“高”的位置。多数的论坛站点需要使用Cookie信息,如果你从来不去这些地方,可以将安全级调到“阻止所有Cookies”。如果只是为了禁止个别网站的Cookie,可以单击“编辑”按钮,将要屏蔽的网站添加到列表中。在“高级”按钮选项中,你可以对第一方Cookie和第三方的Cookie进行设置,第一方Cookie是你正在浏览的网站的Cookie,第三方Cookie非正在浏览的网站发给你的Cookie,通常要对第三方Cookie选择“拒绝”,如图1。你如果需要保存Cookie,可以使用IE的“导入导出”功能,打开“文件/导入导出”,按提示操作即可。
Cookie中的内容大多数经过了加密处理,因此在我们看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。通过一些软件我们可以查看到更多的内容,使用Cookie Pal软件查看到的Cookie信息,如图2所示。它为我们提供了Server、Expires、Name、value等选项的内容。其中,Server是存储Cookie的网站,Expires记录了Cookie的时间和生命期,Name和value字段则是具体的数据。
Cookie的传递流程
适用对象:中级读者
当在浏览器地址栏中键入了Amazon的URL,浏览器会向Amazon发送一个读取网页的请求,并将结果在显示器上显示。这时该网页在你的电脑上寻找Amazon网站设置的Cookie文件,如果找到,浏览器会把Cookie文件中的数据连同前面输入的URL一同发送到Amazon服务器。服务器收到Cookie数据,就会在他的数据库中检索你的ID,你的购物记录、个人喜好等信息,并记录下新的内容,增加到数据库和Cookie文件中去。如果没有检测到Cookie或者你的Cookie信息与数据库中的信息不符合,则说明你是第一次浏览该网站,服务器的CGI程序将为你创建新的ID信息,并保存到数据库中。
Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递,例如,浏览器的打开或刷新网页操作。服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的Cookie设置选择是否保存这些数据。如果浏览器不允许Cookie保存,则关掉浏览器后,这些数据就消失。Cookie在电脑上保存的时间是不一样的,这些都是由服务器的设置不同决定的。Cookie有一个Expires(有效期)属性,这个属性决定了Cookie的保存时间,服务器可以通过设定Expires字段的数值,来改变Cookie的保存时间。如果不设置该属性,那么Cookie只在浏览网页期间有效,关闭浏览器,这些Cookie自动消失,绝大多数网站属于这种情况。通常情况下,Cookie包含Server、Expires、Name、value这几个字段,其中对服务器有用的只是Name和value字段,Expires等字段的内容仅仅是为了告诉浏览器如何处理这些Cookies。
Cookie的编程实现
适用对象:高级读者
多数网页编程语言都提供了对Cookie的支持。如javascript、VBScript、Delphi、ASP、SQL、PHP、C#等。在这些面向对象的编程语言中,对Cookie的编程利用基本上是相似的,大体过程为:先创建一个Cookie对象(Object),然后利用控制函数对Cookie进行赋值、读取、写入等操作。那么如何通过代码来获取其他用户Cookie中的敏感信息,下面进行简单的介绍。
该方法主要有两步,首先要定位你需要收集Cookie的网站,并对其进行分析,并构造URL;然后编制收集Cookie的PHP代码,并将其放到你可以控制的网站上,当不知情者单击了你构造的URL后可以执行该PHP代码。下面我们看具体的实现过程。
  • 分析并构造URL
首先打开我们要收集Cookie的网站,这里假设是登陆网站输入用户名“”(不含引号),对数据进行分析就是你能够控制的某台主机上的一个脚本。需要注意的是“%2B”为符号“+”的URL编码,因为“+”将被作为空格处理。该URL就可以在论坛中发布,诱使别人点击了。
  • 编制PHP脚本221
该脚本的作用就是收集Cookie文件,具体内容如下:
$info = getenv("QUERY_STRING";
if ($info) {
$fp = fopen("info.txt","a";
fwrite($fp,$info."\n";
fclose($fp);
}
>
Cookie的安全问题
适用对象:所有希望上网安全的读者
  • Cookie欺骗
Cookie记录着用户的帐户ID、密码之类的信息,如果在网上传递,通常使用的是MD5方法加密。这样经过加密处理后的信息,即使被网络上一些别有用心的人截获,也看不懂,因为他看到的只是一些无意义的字母和数字。然而,遇到的问题是,截获Cookie的人不需要知道这些字符串的含义,他们只要把别人的Cookie向服务器提交,并且能够通过验证,他们就可以冒充受害人的身份,登陆网站。这种方法叫做Cookie欺骗。Cookie欺骗实现的前提条件是服务器的验证程序存在漏洞,并且冒充者要获得被冒充的人的Cookie信息。网站的验证程序要排除所有非法登录是非常困难的,例如,编写验证程序使用的语言可能存在漏洞。而且要获得别人Cookie是很容易的,用支持Cookie的语言编写一小段代码就可以实现(具体方法见三),只要把这段代码放到网络里,那么所有人的Cookie都能够被收集。如果一个论坛允许HTML代码或者允许使用Flash标签就可以利用这些技术收集Cookie的代码放到论坛里,然后给帖子取一个吸引人的主题,写上有趣的内容,很快就可以收集到大量的Cookie。在论坛上,有许多人的密码就被这种方法盗去的。至于如何防范,还没有特效药,我们也只能使用通常的防护方法,不要在论坛里使用重要的密码,也不要使用IE自动保存密码的功能,以及尽量不登陆不了解底细的网站。
  • Flash的代码隐患
Flash中有一个getURL()函数,Flash可以利用这个函数自动打开指定的网页。因此它可能把你引向一个包含恶意代码的网站。打个比方,当你在自己电脑上欣赏精美的Flash动画时,动画帧里的代码可能已经悄悄地连上网,并打开了一个极小的包含有特殊代码的页面。这个页面可以收集你的Cookie、也可以做一些其他的事情,比如在你的机器上种植木马甚至格式化你的硬盘等等。对于Flash的这种行为,网站是无法禁止的,因为这是Flash文件的内部行为。我们所能做到的,如果是在本地浏览尽量打开防火墙,如果防火墙提示的向外发送的数据包并不为你知悉,最好禁止。如果是在Internet上欣赏,最好找一些知名的大网站。
Cookie是怎样工作的?
要了解Cookie,必不可少地要知道它的工作原理。一般来说,Cookie通过HTTP Headers从服务器端返回到浏览器上。
首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie ,然后,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且把它返回至服务器,从而完成浏览器的论证。
例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如pathdomain、expires等进行了指定。
expires=Monday,01-Mar-99 00:00:01 GMT
上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。
此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传送到指定的服务器上,而决不会跑到其他的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。
说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。
上一部分讲了有关Cookie的技术背景,这部分来说说在PHP里如何设置、使用、删除Cookie,及Cookie的一些限制。PHP对Cookie支持是透明的,用起来非常方便。

设置Cookie的方法

编辑

相关函数

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"];
就这么简单。

导出Cookie的方法

编辑
在Windows XP系统中利用“导入/导出向导”可以方便地导出Cookie信息,方法如下:
第1步,打开“导入/导出向导”并单击“下一步”按钮,在打开的“导入/导出选择”向导页中选中“导出Cookie”选项,并单击“下一步”按钮。
第2步,在打开的“导出Cookie目标”向导页中,单击“浏览”按钮指定合适的位置和文件名,并单击“下一步”按钮。
第3步,打开“正在完成导入/导出向导”向导页,单击“完成”按钮开始导出操作。导出成功后会给出提示,单击“确定”按钮即可。[8] 

删除Cookie的方法

编辑
第一个是:新建一个有相同name名称的cookie,把value值设为空,然后设置它生存时间为0
比如要删除一个名叫username的cookie:
  Cookie c=new Cookie("username","");
  c.setMaxAge(0);
  response.addCookie(c);
第二个是*(vista中):在桌面按F1,弹出帮助, 输入cookie,选择 删除Internet cookie,弹出 "Internet 选项",在 浏览记录 一栏里选择 “删除”,然后弹出删除的内容(包括临时文件,表单记录等),选择 删除cookie,即可。
此法,适用于各种浏览器,包括360,遨游,闪游,火狐,世界之窗等。

IE浏览器

  1. 在打开的下拉列表中点击“Internet选项”。
  2. 在打开的弹出菜单中点击"删除按钮"。
  3. 选中"Cookie 和网站数据",其它项可以不选中,再点击下面的删除按钮。等待约10秒钟左右,就会出现删除成功的提示。
技术分享
IE浏览器删除cookie的操作步骤(4张)

flash

  1. 在打开的“控制面板”中点击 “Flash Player”。
  2. 在打开的"flash player 设置管理器"中选择"存储",再点击"全部删除"按钮。
  3. 最后选中“删除所有站点数据和设置”,然后点击“删除数据”按钮就即可。
技术分享
flash cookie删除步骤(4张)

PHP Cookies

编辑
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。[9] 

创建 Cookie

setcookie() 函数用于设置 cookie。[9] 
注释:setcookie() 函数必须位于 <html> 标签之前。
语法:
setcookie(name, value, expire, path, domain);
在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "Alex Porter"。我们也规定了此 cookie 在一小时后过期:
1
2
3
4
5
6
<?php
setcookie("user","AlexPorter",time()+3600);
?>
 
<html>
.....
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)

取回 Cookie 值

PHP 的 $_COOKIE 变量用于取回 cookie 的值。[9]  
  在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:
1
2
3
4
5
6
7
<?php
//Printacookie
echo$_COOKIE["user"];
 
//Awaytoviewallcookies
print_r($_COOKIE);
?>
在下面的实例中,我们使用 isset() 函数来确认是否已设置了 cookie:
1
2
3
4
5
6
7
8
9
10
11
12
<html>
<body>
 
<?php
if(isset($_COOKIE["user"]))
echo"Welcome".$_COOKIE["user"]."!<br>";
else
echo"Welcomeguest!<br>";
?>
 
</body>
</html>

删除 Cookie

当删除 cookie 时,您应当使过期日期变更为过去的时间点。[9] 
删除的实例:
1
2
3
4
<?php
//settheexpirationdatetoonehourago
setcookie("user","",time()-3600);
?>

JavaScript Cookies

编辑

  创建和存储 cookie[10] 
在这个例子中我们要创建一个存储访问者名字的 cookie。当访问者首次访问网站时,他们会被要求填写姓名。名字会存储于 cookie 中。当访问者再次访问网站时,他们就会收到欢迎词。
  首先,我们会创建一个可在 cookie 变量中存储访问者姓名的函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
functionsetCookie(c_name,value,expiredays)
 
{
 
varexdate=newDate()
 
exdate.setDate(exdate.getDate()+expiredays)
 
document.cookie=c_name+"="+escape(value)+
 
((expiredays==null)?"":";expires="+exdate.toGMTString())
 
}
上面这个函数中的参数存有 cookie 的名称、值以及过期天数。
  在上面的函数中,我们首先将天数转换为有效的日期,然后,我们将 cookie 名称、值及其过期日期存入 document.cookie 对象。
  之后,我们要创建另一个函数来检查是否已设置 cookie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
functiongetCookie(c_name)
 
{
 
if(document.cookie.length>0)
 
{
 
c_start=document.cookie.indexOf(c_name+"=")
 
if(c_start!=-1)
 
{
 
 
c_start=c_start+c_name.length+1
 
c_end=document.cookie.indexOf(";",c_start)
 
if(c_end==-1)
c_end=document.cookie.length
 
 
returnunescape(document.cookie.substring(c_start,c_end))
 
}
 
}
 
return""
 
}
上面的函数首先会检查 document.cookie 对象中是否存有 cookie。假如 document.cookie 对象存有某些 cookie,那么会继续检查我们指定的 cookie 是否已储存。如果找到了我们要的 cookie,就返回值,否则返回空字符串。
  最后,我们要创建一个函数,这个函数的作用是:如果 cookie 已设置,则显示欢迎词,否则显示提示框来要求用户输入名字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
functioncheckCookie()
 
{
 
username=getCookie(‘username‘)
 
if(username!=null&&username!="")
 
{alert(‘Welcomeagain‘+username+‘!‘)}
 
else
 
{
 
username=prompt(‘Pleaseenteryourname:‘,"")
 
if(username!=null&&username!="")
 
{
 
setCookie(‘username‘,username,365)
 
}
 
}
 
}
这是所有的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<html>
 
<head>
 
<scripttype="text/javascript">
 
functiongetCookie(c_name)
 
{
 
if(document.cookie.length>0)
 
{
 
c_start=document.cookie.indexOf(c_name+"=")
 
if(c_start!=-1)
 
{
 
 
c_start=c_start+c_name.length+1
 
c_end=document.cookie.indexOf(";",c_start)
 
if(c_end==-1)
c_end=document.cookie.length
 
 
returnunescape(document.cookie.substring(c_start,c_end))
 
}
 
}
 
return""
 
}
 
 
functionsetCookie(c_name,value,expiredays)
 
{
 
varexdate=newDate()
 
exdate.setDate(exdate.getDate()+expiredays)
 
document.cookie=c_name+"="+escape(value)+
 
((expiredays==null)?"":";expires="+exdate.toGMTString())
 
}
 
 
functioncheckCookie()
 
{
 
username=getCookie(‘username‘)
 
if(username!=null&&username!="")
 
{alert(‘Welcomeagain‘+username+‘!‘)}
 
else
 
{
 
username=prompt(‘Pleaseenteryourname:‘,"")
 
if(username!=null&&username!="")
 
{
 
setCookie(‘username‘,username,365)
 
}
 
}
 
}
 
</script>
 
</head>
 
 
<bodyonLoad="checkCookie()">
 
</body>
 
</html>

JspCookie

编辑
jsp中使用cookie完成状态管理:
cookie也算http消息报头的一部分,它的作用有以下方面:
一 记录访客的某些信息。例如可以利用cookie记录用户光临的网页次数,或者访客曾经输入过的信息。某些网站可以自动记录用户上次登录的用户名,用的就是cookie。
二 页面之间传递变量。浏览器并不会保存当前页面上任何变量的信息,当页面被关闭时,页面上的所有变量信息将随之消失。
使用举例
在jsp中创建简单的cookie:
String cookiename="visitTimes";
Cookie cookie=new Cookie(cookiename,"1");
  1. setMaxAge(10*60);//设置cookie存活期
  2. addCookie(cookie);//将cookie写入客户端
在jsp中处理cookie数据的常用方法:
getDomain();返回cookie的域名.
getMaxAge();返回cookie的存活时间
getName();返回cookie的名字
getPath();返回cookie适用的路径
getSecure();如果浏览器通过安全协议发送Cookie将返回true值,如果浏览器使用标准协议刚返回false值
getValue();返回cookie的值
getVersion();返回cookie所遵从的协议版本setComment(String purpose);设置cookie的注释
setPath(String url);设置Cookie的适用路径
setSecure(Boolean flag);设置浏览器是否仅仅使用安全协议来发送cookie,例如使用Https或ssl
setValue(String newvalue);cookie创建后设置一个新的值
setVersion(int v);设置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使用的功能,保护用户隐私安全。[11] 

超级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”带来的问题同样存在。[12] 
词条图册更多图册
技术分享
词条图片(6)
技术分享
IE浏览器删除co...(4)
技术分享
flash cookie删...(4)
1/2
参考资料
  • 1.  HTTP State Management Mechanism  .rfc editor[引用日期2014-11-12]
  • 2.  汤明伟..浅谈 COOKIE 技术:常州信息职业技术学院学报,2005
  • 3.  朱远文, 张煜, 常畅, 等.基于 Cookie 的安全防护技术研究:信息网络安全,2012
  • 4.  基于Cookie信息的互联网精准定向技术研究  .seo博客[引用日期2013-03-19]
  • 5.  cookie 
  • 6.  查看源网页 
  • 7.  c#中的cookie编程 
  • 8.  在Windows XP系统中导出Cookie信息 
  • 9.  PHP Cookies  .W3Cschool 菜鸟教程[引用日期2014-03-5]
  • 10.  JavaScript Cookies  .w3school[引用日期2014-07-21]

cookie (储存在用户本地终端上的数据)