嗯,还是那个弹幕项目,要实现一个用户身份追踪,因此研究了各种方案。不过估计那些做统计和广告的公司分析的比我要透彻得多吧。
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验证失败的话再用以下手段辅助验证,应该是不错的选择。
navigator.userAgent —— 检测浏览器信息,局限性在于这个可以被任意修改,最好不要用。
navigator.plugins —— 检测浏览器安装了什么插件,不同电脑安装的插件版本号等都不一样。这个只能作为辅助验证手段,重复率可能会比较高。
navigator.mimeTypes —— 作为辅助验证手段,感觉这个更没什么用的样子啊=.=||
Canvas fingerprinting —— 只能作为辅助手段,重复率非常高。不过在Android手机下倒是可以试试,感谢国产浏览器厂商乱改内核。
window.screen —— 检测屏幕分辨率,其下height、width、colorDepth、deviceXDPI都是非常好的辅助验证手段。
各浏览器专用特殊API
UC浏览器U3内核专用API
navigator.control系列
微信浏览器API