于悄无声息中获取你的访问记录

当访问某个网站时,不经意中,就被别人猜测到你是否访问过某个网站,而这却没有什么技术性的东西,也不算是违法的行为。

奥秘在于浏览器对于访问过的链接会用伪类 :visited 来标识。

那么很容易想到的一个方法就是,用 a:visited 来设定一个特定的颜色值,比如 red。然后从一个 URL 列表中来动态创建一个链接,然后获取其颜色(各浏览器返回的结果不完全一致,可能是 rgb 值,也可能是 hex 值),如果跟设定的颜色一致,那么就可以确定用户在当前浏览器访问过该链接。

实际测试中会发现,新版本的浏览器(如Chrome 14, IE9, FF5)对于 a:visited 的样式是成功应用的,但获取到的颜色却不是对应的设定,而是 a:link、a 甚至是默认的颜色,从而无法判断用户是否访问过该链接。这是现代浏览器在这方面的安全保护,一方面使样式可以正常生效,另一方面却防止了 JS 窃听。然而,在一些旧版本的浏览器(比如IE6~8, FF3)上面却没有这个保护措施,因而可以判断出是否在该浏览器上访问过该链接。

对于以上依赖于 JavaScript 的窃听,很容易想到的一个防止方法就是禁止 JavaScript 的运行。没错,抛开种种不便来说,的确可以达到防止以上窃听的目的,即便是 IE6 等老一代浏览器。但是,却防止不了 CSS 的窃听方式。

又是如何利用 CSS 来进行判断窃听的吗?方法其实很简单,还是利用 :visited 伪类。

对于一个 <a href=”link1″ id=”link1″></a> 这样的链接可以加上以下样式:

1
2
3
#link1:visited{
background-image: url(history_log.php?visit=1);
}

因此,当该链接曾被访问过,那么就会请求 history_log.php 文件,并传送参数以说明该链接被访问过。由于这个并不依赖于 JavaScript,所以即便禁用了 JavaScript 也可以获取到。

实际测试中,发现,在 Chrome、IE9、FF5 中还是对这个做了保护措施,样式可以正常生效,但却没有发送请求到后台。从网络请求来看,初步判断应该是阻止了background-image样式。但对于FF3、IE6~8,由于没有相应的保护,还是正确获取到了请求记录。

可以看到,在 web 年代,安全问题无所不在,甚至不需要什么高深的黑客知识,有时候只是一些特性就导致了所预想不到的问题。

最后,可以看到,新的问题层出不穷,为了应对这些问题,所以有 bug 修复,有升级。浏览器升级不仅仅是界面的改变,也有安全性方面的更新。

所以,太古老的东西还是让其归于历史吧.


Reference:

what the internet knows about you

《于悄无声息中获取你的访问记录》有8个想法

  1. 这个···对我来说没什么事啦。哈哈···我用谷歌浏览器应该没事

评论已关闭。