不用Cookie的“Cookie”技术

jopen 11年前

        有另外一种比较隐蔽的用户追踪技术,不使用 cookie 或者 Javascript。很多网站已经在用了,但知道的人不多。本文就来介绍一下这种技术是如何追踪用户,用户又该如何避免追踪。

        这种技术不依赖于:

  • Cookies
  • Javascript
  • LocalStorage/SessionStorage/GlobalStorage
  • Flash, Java 或插件
  • 你的 IP 地址或者 User Agent 头
  • Panopticlick

        相反,它使用另外一种存储方式,而这种存储即使浏览器关闭仍然能够存在,那就是浏览器缓存。 即使你完全禁用了 cookie 和 Javascript,甚至使用 V*N 服务,这种技术仍然能够跟踪到你。

不用Cookie的“Cookie”技术

        示例

        到这个链接(http://lucb1e.com/rp/cookielesscookies/ )上提交一些数据,然后关闭浏览器,然后再打开,看看数据是不是仍然在那里?

        看一下你的 Cookie 里面的有没有东西?没有的吧,这些都在我们几乎没有察觉到的一个假的图片校验。看一下上面那个眼睛,哈哈,那是我们的追踪者。

        它如何工作?

        下图是一个大致描述

不用Cookie的“Cookie”技术

        图像中的 ETag 是一种图像校验方式,当图像发生变化的时候,ETag 也会随之发生变化。因此,浏览器会拿着图片和 ETag 去服务器进行校验,让服务器来应答这张图片是否发生改变,如果没有的话,这张图片就直接从浏览器缓存中命中返回,无需再去服务器重新拉取图片了。

        细心的读者可能已经大概知道这个是如何可以实现追踪的:浏览器把之前的 ETag 发回到服务器就 OK 了。不过,通过这个 ETag 貌似能产生好多好多 Cookie,不是吗?于是,服务器可以给每个浏览器一个唯一的 ETag,再次收到这个 ETag 的时候,就能知道是你了。

        Demo 中的一些技术细节和缺陷

        Demo 为了能够不借助于 Javascript,我不得不找出一些信息对你来说是唯一的,除了那个 ETag。图片是在页面加载后加载的,不过只有图片里面有 ETag。我是如何将时间信息显示出来呢? 我确实做不用 Javascript 动态更新数据,而这 Demo 就是要证明不用依赖 Javascript。

        一些小 bug:

  • 所有你看到的信息都是上一次的。需要按 F5 才能刷出最新的。
  • 当你访问页面的时候不携带 ETag (比如隐身模式),会话就会被清空。 或者说,你刷新页面的时候,数据就会消失。

        我没有看到这种技术的比较简单的解决方案。当然有些东西可以做一下,可能其他网站不会用,不过我就是想让代码简单实用就行。

        请注意,当你确实想去追踪某个人,你又不打算告诉用户他们正在被追踪,你这些 bug 是不存在的!

        源代码

        哪个程序没有源代码? 噢,好像是微软的 Windows。

        https://github.com/lucb1e/cookielesscookies

        如何避免追踪?

        如果你想更安全一些, 我强烈建议你开启隐身模式,使用 HTTPS。只要这样开一下,就能防止 BREACH (最新的 https 攻击),禁止了 cookie 跟踪,也消除本文讲到的缓存跟踪的问题。用网银的时候,我会使用隐身模式。在 Firefox(IE 应该也是)按 Ctrl + Shift + P,在 Chrome 中按 Ctrl + Shift + N。

        除此之外,要看你对于隐私安全的洁癖程度了。

        目前,我没有简单完美的办法,因为缓存跟踪几乎是无法察觉的,但同时缓存本身很有用,能够节省时间和金钱。网站将消耗更少的带宽(你仔细想想, 到底是谁会为这些流量买单),你的网页加载速度更快,尤其是在移动设备上,将会有很大的区别,如果你没有一个无限流量的套餐的话,如果你在网速很慢的地 方,缓存的效果就更加明显了。

        听了这些,如果你还是不放心,那么完全禁用缓存吧。没有了存储性状态或者信息,任何追踪都不会发生,就是每次都要重新加载,速度会慢一些,并且我个人并不认为值得这样做。

        Firefox 的插件 Self-Destructing Cookies 有这样的功能:当你一段时间不使用浏览器,它就会清空你的缓存。这个插件的定期清空缓存可能是一个不错的选择,只有在访问会话期间会被追踪,不过反正他们 也能够记录下哪个 IP 访问了哪个页面,所以这是没有什么大不了的。不过之后的访问由于缓存被清空(假设跟踪是基于缓存),看起来都是一个新的用户,追踪将无法继续。

        我不知道任何其他能够定期清除缓存的插件(例如,每 72 小时一次),但应该是有的。这将是一个很好的方法,这对于 99% 的用户都是有用的,因为这个并不会使性能下降太大,同时还限制了追踪。

        更新:我听说 Firefox 的插件 SecretAgent 也有 ETag 的覆盖,以防止这种类型的追踪。你可以对于有些站点设置白名单重置缓存,以达到防止追踪的目的。这个已经确认能够防止追踪。SecretAgent 的网站。