Cookie-天使还是恶魔?

   HTTP是一种无状态的协议-Web服务器不必保持与过去或者将来请求的任何信息。当一个Http请求到达服务器后,服务器总是这样认为的:"这小子,新来的!",但是服务器有没有理由保持用户的会话状态呢?当然有。例如,在对访问的授权中,服务器就不得不记住这些来历不明的坏小子么。通过什么手段能达到这样的目的呢?最为人熟悉的解决方案就是Cookie.下面我们就谈谈Cookie的工作原理和利弊.
1.Cookie的定义
   Cookie是一种在HTTP中对状态进行管理的方式。它是一种少量的状态数据,由We站点服务器发送给浏览器,并代表服务器存储在用户的机器上。
2.使用Cookie的动机
   服务器随其响应向浏览器发送一个Cookie,请求浏览器在随后的请求中包含此Cookie,采用这种方式,Web服务器就能在会话中跟踪用户。Cookie中的消息可能是唯一的,这样便可以单独的跟踪特定的用户,也可能是剪辑,使得服务器能够统一跟踪来自一家单位的所有用户。

   比如,在一个电子商务网站中,如果没有Cookie,每当用户请求该站点的时候,都会要求用户填写一份标识自己身份的表单,这么繁琐的过程,用户会很快失去耐心。但引入了Cookie之后,这个问题就得到了很好的解决。比如在“购物车",用户将自己想要买的商品放入其中,那么Web服务器就会记住顾客想要买的商品列表,这样用户就像真的在超市一样,把自己想要的东西放入车里,等结账的时候,统一付费,当然你在购买的过程中,还可以把放入购物车的商品放回去。对用户和Web服务器来说,这无疑是一种福音。但有一句话说得好:"天下绝对没有免费的午餐",Cookie在被称为"Web上的甜饼"的同时,由于对用户隐私的影响,Cookie也成为备受争议的主题。
3.Cookie在浏览器中的使用 
 下图显示了Cookie在浏览器中的使用过程,
  
客户机将请求发送给原始服务器,原始服务器在其响应中包含一个含有Cookie值得标头(Set-Cookie),在未来所有对该服务器的请求中,客户端都会包含Cookie。注意在客户端存储Cookie的时候,并不对Cookie字符串(XYZ)进行任何的解释。服务器可以依据生成请求的客户端,相应对的剪辑字符串进行构造,并更改用于构造Cookie字符串的机制。该图也可以表明进行Cookie交互的时候,无须用户的参与,除非事先要求每当Cookie发出时,便向用户进行通知。这也就在意定程度上对用户的隐私造成了威胁。
 当用户浏览器接受到Cookie之后,起初是存放于浏览器的内存中,当浏览器退出的时候,会以磁盘文件的形式写入稳定存储器中。在这个过程中有一定的规则,如果Cookie具有的超时时间设定大于当前浏览器退出时间,Cookie会存储,如果不大于,就不必要存储,这就是有人说的设置了超时的Cookie会存储,而没有设置的Cookie只用于浏览器会话。Cookie最多4KB的长度,对于单独的浏览器来说,它为每个服务器或者域提供最多20个Cookie,总共可提供300个Cookie。
4.Cookie的隐私问题
   Cookie得到了广泛的应用,但同时被怀疑会引起对个人隐私的侵犯。开始的时候,如果浏览器设定允许Cookie,许多的用户甚至不知道他们在发送Cookie,Cookie用明文发送,而且用Http嗅探工具,也能很简单的探到Cookie信息 ,而数据包在网络中传输的时候,Cookie的信息也能够被别有用心的人修改。另外,由于服务器可能使用Cookie的一部分作为后端数据库的索引,如果对Cookie进行了修改,会造成数据库中同用户无关的那部分数据出现不为人知的改动。许多的用户不知道谁有他们的Cookie的访问权以及对Cookie信息作了些什么,例如Cookie可以在公司间共享,这样就可以被别有用心的非法出售 .
为了证明上述说法,我做了一个简单的测试程序,然后用HttpWatch这款Http嗅探工具,进行嗅探 从图中可以看出 ,能很容易的获得Cookie的值,当然如果是用户自己,那无所谓了,但是一些木马,病毒如果也能够获得,那就泄露了用户的隐私。
此外,Cookie信息由原始服务器不同的另一个服务器进行传递,问题就会变得更加严重。比如有这样一种情形,用户访问门户站点A,网址:www.a.com,A网站要收集用户的信息可以通过以下方式,设置一个专门用于收集信息的站点s.a.com,比如访问www.a.com/1.aspx,站点A首先将该请求重定向到s.a.com,形成这样的请求 s.a.com/count.aspx?return=www.a.com/1.aspx,这样的话,s.a.com就可以将cookie的信息收集起来,然后再重定向给www.a.com/1.aspx,但用户并不知道有这么一个繁琐的过程。就像一个人司机接受交警检查,司机出示了驾驶证,交警可能将该驾驶证传递给其他人看,然后再交回司机手里一样,这样司机的隐私信息就有更大的风险被曝漏。如图:

对于服务器而言,Cookie也可能是危险的,比如站点A是一个联盟,他下面有类似于代理的用户,并且分级别,比如代理A,代理B都属于1级代理,1级代理下面有相应的子代理,那么很可能代理A就可以偷窥到代理B的子代理信息,如果服务端权限系统不完善的话,用户A可以仿造一个代理B的标识,利用自己是一级代理的身份绕过一些系统验证,在系统疏忽后者漏洞出冒充代理B。造成对服务器和其他用户的威胁。
  Cookie无疑在web世界中充当了天使,它能够使本来没有状态的HTTP的记性变好,但同时在对用户隐私保证和对服务器潜在威胁上,它可以说是一个恶魔。
使用Cookie的时候一定要注意这样的问题是Cookie是保存在客户端的,服务端这样是删除不了Cookie的,见一哥们这样使用,Response.Cookies.Remove(Response.Cookies[0]);正确使Cookie过期的方式向客户端发送一个过期的同名Cookie即可
posted @ 2007-02-12 14:27  Robin Zhang  阅读(4823)  评论(14编辑  收藏  举报