Cookie-天使还是恶魔?
HTTP是一种无状态的协议-Web服务器不必保持与过去或者将来请求的任何信息。当一个Http请求到达服务器后,服务器总是这样认为的:"这小子,新来的!",但是服务器有没有理由保持用户的会话状态呢?当然有。例如,在对访问的授权中,服务器就不得不记住这些来历不明的坏小子么。通过什么手段能达到这样的目的呢?最为人熟悉的解决方案就是Cookie.下面我们就谈谈Cookie的工作原理和利弊.
1.Cookie的定义
Cookie是一种在HTTP中对状态进行管理的方式。它是一种少量的状态数据,由We站点服务器发送给浏览器,并代表服务器存储在用户的机器上。
2.使用Cookie的动机
服务器随其响应向浏览器发送一个Cookie,请求浏览器在随后的请求中包含此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即可
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。