关于浏览器身份追踪技术的研究与整理

zsx in 记录整理 / 13 / 7853

嗯,还是那个弹幕项目,要实现一个用户身份追踪,因此研究了各种方案。不过估计那些做统计和广告的公司分析的比我要透彻得多吧。


Cookie

浏览器兼容性:全平台。

实现难度:低。

最为简单的方式,但是也是最容易被清除的方式。只需要在浏览器设置里清理,就傻逼了。


HTML5存储(localStorage、IndexedDB、sessionStorage)

浏览器兼容性:除IE9-的所有浏览器,开启JavaScript。

实现难度:低。

特色:可长期保存,数据容量大。

实现原理和Cookie类似,只是换了载体导致数据只能通过JavaScript读和写。在IE8和以下版本无效,在IE9以上“启用保护模式”后将没有权限访问。可以被很容易地清除。



Local shared object (Flash Cookie)

浏览器兼容性:所有PC,安装Flash,开启JavaScript;不支持iOS、Windows Phone和未安装Flash的Android。

实现难度:中。

特色:可跨浏览器。

实现原理和Cookie类似,只是载体换为了Flash。相关开源类库:https://github.com/nfriedly/Javascript-Flash-Cookies

可以跨浏览器使用,只要浏览器调用的是同一个Flash组件(如Internet Explorer和Mozilla Firefox之间信息便可共享,但Google Chrome和Mozilla Firefox便不行)。

虽然可以跨浏览器,但隐身模式无效。可以被很容易地清除。


Silverlight Isolated Storage

浏览器兼容性:Windows、Mac,(第三方支持)Linux,安装Sliverlight,不支持手机。

实现难度:中。

把它当成和Flash Cookie一样的东西好了,基本上没有人现在还安装SL了吧?


Canvas fingerprinting

浏览器兼容性:除IE9-的所有浏览器,开启JavaScript。

实现难度:高。

特色:隐身模式可用。

实现原理见:维基百科(https://www.wikiwand.com/en/Canvas_fingerprinting)。相关开源库:https://github.com/Valve/fingerprintjs

由浏览器在不同环境下生成的Canvas图像不同而得以追踪用户,所以是跟着浏览器走。无法被清除,但当浏览器更新,或是安装什么奇怪的软件后可能便会被视为一个新用户。在IE10+生成的信息完全一样,在同配置的iPhone上生成的信息也完全一样。其它浏览器下重复率非常高。


ETag

浏览器兼容性:全平台。

实现难度:中。

特色:完全由服务器追踪,利用浏览器缓存机制。

实现原理:ETag是一种缓存验证机制,当浏览器下次访问时某个资源时,会自动带上ETag来和服务器校验资源是否有变动。(https://www.wikiwand.com/zh/HTTP_ETag)。这样,每当用户不带ETag访问时,都生成一个不冲突的ETag并保存。刷新时由服务器验证一下ETag即可追踪身份。

JavaScript不可获得数据(AJAX除外),随着浏览器缓存的清理而被清除。隐身模式无效。


Web Cache(说实话这玩意名字我不知道)

浏览器兼容性:全平台,开启JavaScript。

实现难度:高。

特色:利用浏览器缓存。

实现原理:首次访问时,服务器返回一张含特殊信息的信息并设置缓存。JavaScript用各种方法读取该服务器发回的有关信息。用户下次访问时,JavaScript读取到的信息即为缓存的内容。随着浏览器缓存的清理而被清除。隐身模式无效。


HSTS SuperCookie

浏览器兼容性:Chrome、Firefox 34版本前、IE11;Android、iOS、WP。

实现难度:高。

特色:隐身模式可用。

实现原理:好长我不知道该怎么说……示例:http://www.radicalresearch.co.uk/lab/hstssupercookies/ 

Firefox 34+、Windows Phone不支持。在iOS下可被同步。还有实在是太慢了之外,近乎完美的追踪方式。不过没有开源库,我自己也懒得写=.=



在我看来,如果要追踪用户的话,完全可以绕过用户修改的是没有的。但是,有修改难度之分。

通过以下几个方法入手,可以绕过隐身模式。又由于都是浏览器相关的,所以重复度比较高。

我想,用HSTS SuperCookie作为主要验证依据,如果HSTS验证失败的话再用以下手段辅助验证,应该是不错的选择。


  1. navigator.userAgent —— 检测浏览器信息,局限性在于这个可以被任意修改,最好不要用。

  2. navigator.plugins —— 检测浏览器安装了什么插件,不同电脑安装的插件版本号等都不一样。这个只能作为辅助验证手段,重复率可能会比较高。

  3. navigator.mimeTypes —— 作为辅助验证手段,感觉这个更没什么用的样子啊=.=||

  4. Canvas fingerprinting —— 只能作为辅助手段,重复率非常高。不过在Android手机下倒是可以试试,感谢国产浏览器厂商乱改内核。

  5. window.screen —— 检测屏幕分辨率,其下height、width、colorDepth、deviceXDPI都是非常好的辅助验证手段。

  6. 各浏览器专用特殊API

    1. UC浏览器U3内核专用API

      1. navigator.control系列

      2. 服务器端API:http://www.uc.cn/download/UCBrowser_User_Agent.pdf

    2. 微信浏览器API

      1. http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

如果本文对你有帮助,你可以用支付宝支持一下:

Alipay QrCode
c at 2015/4/26[回复]
理论上讲还是用户数据库方便些
zsx at 2015/4/26[回复]
为了方便