提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

这篇文章是我所选修课程的作业,简单介绍了XSS、Cookie、Web安全威胁和个人隐私泄露问题,个人见解仅供参考,如有不当之处还望批评指正。

大家上网肯定对于HTTP并不陌生,完整的网址开头大多就是以 http:// 开始的(当然不全是,加密的SSL浏览技术的网址是以 https:// 开头的),HTTP表明的就是 H ypertext T ransfer P rotocol超文本传输协议,大多数网页就靠它传输并呈现在我们的面前了。

现在的问题在于HTTP是建立在TCP/IP基础上的,我们知道TCP/IP协议是无状态协议(Stateless),这里的无状态就是说TCP/IP协议不保存连接的客户端的状态,更通俗一点是TCP/IP比较健忘,比如刚才客户端通过TCP/IP对服务器发送了一条消息,然后断开连接后再一次的连接服务器再发一条消息,这里同样的客户端,服务器并不知道这两条消息来自同一客户端,每次连接的建立服务器将认为是新客户端发起的请求。

无状态TCP/IP协议示意图

TCP/IP的简单构造保证了网络的可靠、稳定和易扩展,也构成了我们现在用的互联网,但也由于TCP/IP的这种特性,一开始建立在这之上的HTTP协议就从娘胎带来了无状态的问题,后来HTTP协议的设计者们通过引入Cookie解决了这个问题。

如何让服务器记住来访的客户端,利用Cookie技术配合服务器Session会话技术很容易实现,首先客户端访问服务器端,服务器端向客户端发送一个带唯一ID的Cookie并被客户端接受存储在本地存储设备上,如下图所示:

Cookie保持HTTP的状态

当然服务器端也不能闲着,它需要存储这个ID及相关资源到内存、硬盘或者数据库等存储设备上,这个存储的就叫Session(会话),这样下一次客户端访问服务器端资源时会同时发送之前存储的Cookie,然后服务器端检索到这个Cookie上的ID,并搜索自己存储的ID,如果找到相关对应关系,服务器端就知道客户端之前已经访问过了,如下图所示:

Cookie保持HTTP状态流程图

这样的场景主要用在什么地方呢?很常见的一个使用就是登录认证,这样上述场景的那个包含唯一ID的Cookie就是就是授权认证Cookie,在认证通过的情况下服务器向客户端发送授权Cookie并记录ID保存到Session中,然后这个客户端就会被认为是已经授权的了,所有的访问服务器端都会核对客户端发来的授权Cookie在认证Session中是否有记录,有的话则表明已经授权可以访问,没有的话则显示拒绝访问页面:

基于Cookie和Session用户身份认证

有人会想如果我盗取了Cookie里那个服务器发送的ID,那么我不是就可以欺骗服务器了么,让服务器认为我是“那个客户端”?对的,这是有可能发生的,这种手段又称作为Cookie窃取,现代浏览器的安全措施里面包含了防止跨站盗取Cookie的措施(即每个Cookie包含网站网址的戳,对应域名下的Cookie仅发给相应域名的服务器),这样你就不用担心其他网站会盗取你的Cookie啦:

Cookie窃取

当然这也不是绝对安全的,这里的安全取决于浏览器和Cookie所对应的网站自身,现在浏览器的漏洞会比较少,大多数情况下是Cookie发送方的网站出了问题,这也就是经典的跨站XSS攻击的一个方面,不怀好意者会在漏洞页面植入一段JavaScript,然后通过 document.cookie 方法盗取Cookie。

这方面例子也有,前一段时间某高校邮箱文本过滤漏洞,某同学通过发送特别构造的JavaScript拿到了老师邮箱登录的Cookie并欺骗服务器从而登录成功。

所以Cookie的发送方,网站本身要做好安全措施,不让好事者有机可乘。

说了这么多,其实Cookie的功能也是很强大的,之前说的是正面的功能,比如为我们提供好的浏览体验,当然也有人用它去做不好的事情,比如Cookie跟踪技术,接下来我将简单谈谈Cookie跟踪技术。

前面已经讲到,有了Cookie我们的HTTP网站可以“记住”来访者,有人利用这种特性对Cookie进行了改造,使其能够记录我们浏览的网页,甚至分析出我们的爱好等等,我想很多人会遇到这种情况:比如我们在淘宝或者京东商城上搜索某一商品,然后我们在其他网站上的广告就会向我们推送类似的商品,也就是说这些广告商“记住”了我们刚才的搜索内容,这又是怎么做到的呢?

仍然是Cookie技术,广告商采取iframe隐藏框架,引入他们自己的服务器页面,这个页面包含Cookie判断和发送的机制,然后广告商将这些包装成可使用的代码提供给各大网站,当然使用的网站越多越好。

然后客户端访问这些网站,必定会触发iframe隐藏框架的内容,如果之前客户端没有请求过这家广告商的服务,那么广告商就可以通过iframe隐藏框架给客户端发送Cookie也就是贴上一个标签,然后数据库里创建这个用户对应的资料,下一次该用户再一次访问的时候就会获取相应的信息记录访问的网址,就是这样用户的行踪就被记录了。

等等,你会说:我上网习惯很好,浏览结束后会清除Cookie和浏览记录,但是实际上你的行踪仍然被记录了,这是为什么呢,因为在这个星球上还有一个称为Cookie僵尸的东西,为什么叫僵尸呢?因为它会死灰复燃,也就是说你清除了Cookie后会被恢复,这个的原理是多种存储技术互补,比如HTML有Storage存储技术,Flash有Flash Cookie,包括URL参数跟踪等等,结合普通的HTTP Cookie,如果你删除其中一种而没有赶尽杀绝的话,其他技术会恢复被删除的Cookie,就好像Cookie死灰复燃了一样。

一个典型的例子就是 evercookie ,这是个开源项目,运用了多种手段存储用户信息,其中的技术主要有:

- Standard HTTP Cookies 
     - Local Shared Objects (Flash Cookies)
     - Silverlight Isolated Storage 
     - Storing cookies in RGB values of auto-generated, force-cached 
        PNGs using HTML5 Canvas tag to read pixels (cookies) back out
     - Storing cookies in Web History 
     - Storing cookies in HTTP ETags 
     - Storing cookies in Web cache 
     - window.name caching
     - Internet Explorer userData storage
     - HTML5 Session Storage 
     - HTML5 Local Storage 
     - HTML5 Global Storage 
     - HTML5 Database Storage via SQLite