2024年1月9日发(作者:)

JavaScript奇技淫巧:设备指纹

设备指纹,通常指浏览器设备指纹,通过从浏览器获取的特征信息,从而可以识别是否是同一访问者。

指纹信息通常从数个维度获取,大类如:navigator、window、screen。

例,navigator信息:

这些信息中,有些特别的、固定的、可以于识别用户系统特征的数据,如:操作系统类型、语言、浏览器名称、浏览器插件、屏幕分辨率、屏幕大小、CPU数量、时区、屏幕是否支持触控、是否支持Cookie、是否支持本地存储、是否支持webgl等等。

这些数据的集合,便形成了该设备的唯一特征,就像人的指纹一样,可以通过它来识别一个设备。如下图所示:

注:指纹识别的准确率决定于识别选择的数据源,但数据源并非越多越好,太多或太少,都容易造成误报,通常是经过大量测试,选取合适的数据项,本文做演示,仅使用了少量数据源。

此时,已经获取到指纹数据,但内容多,不利用比对指纹以识别设备。通常,这时会对数据进行进一步处理,比如:进行md5化,形成一个字符串特征码。

当然也可以采用其它的算法,这里,采用一种简单的自定义算法获取特征:

源码

运行效果

设备指纹主要用于:免登录校验、陌生用户识别,比如判断一个来访客户是第几次访问、访问了多少个页面、是否点击了商品、广告、是否下单、在哪个页面退出、是否进行了危险操作等等。

而有时,某些懂技术的或有目的的访问者不希望自己被识别,从而可能通过查看网页中的JS源码,分析指纹获取源,而有针对性的修改指纹源数据,规避识别。为了防止这种情况,应对方法通常有两种:

首先,在前端,对实现指纹功能的JS代码用JShaman进行加密混淆,防止分析。同时,可以将指纹数据发往后端,在后端再进行进一步判断。

其次,在后端,接收到前端的指纹后,可判断有多少指纹是匹配的,如:80%、90%,那么可猜测有一部分数据可能被修改了。并且,再结合“后端指纹”:如:来访者IP、cookie等对其进行二次指纹认定。