最近接手一个小功能, 系统允许匿名用户无验证的情况下进行某种点单行为, 说白了, 就是允许用户不经过验证提交表单 ! 很多人下意识会想到记录用户mac地址, 我们先不说mac地址可以随意伪造, 其次需要了解下网络的下三层是怎么传输的, mac地址是二层地址, 在客户端到客户的路由器,路由器到路由器,路由器到你们的服务器之间的每一跳都会改变,哪怕你拦截你服务器的所有二层流量,那么你拿到的也是把流量转发给你的路由器的 MAC, 更不用说这些高级语言无法拦截二层流量. 所以mac地址记录根本不可能!


PS: IE下倒是可以利用AcitiveX进行mac地址获取, 问题现在谁还用IE 😭, 当然假如你的 JS 是跑在客户端的 NodeJS 中,答案是可能的.相关的一些问题 Stackoverflow有人问过了,不做赘述.

那么我们现在依然回到原来的问题, 只能通过前端JS能获取到的一些有限信息来生成用户指纹,模拟出用户! 当然,别人已经把轮子造好了.我们直接用吧!

介绍 : Fingerprintjs2 是一款开源的设备指纹采集器。最早的版本的 fingerprintjs 库创建于 2012 年,但是由于新版本的开发很难保持向后兼容,因此诞生Fingerprintjs2 项目中增加了很多的新内容。

示例:(返回的是所有特征的数组,未经过hash, 可以附带参数, 见github)

if (window.requestIdleCallback) {
    requestIdleCallback(function () {
        Fingerprint2.get(function (components) {
          console.log(components) // an array of components: {key: ..., value: ...}
        })
    })
} else {
    setTimeout(function () {
        Fingerprint2.get(function (components) {
          console.log(components) // an array of components: {key: ..., value: ...}
        })  
    }, 500)
}

指纹资源可配置列表

1、User Agent

2、语言

3、颜色深度

4、屏幕分辨率

5、时区

6、是否具有会话存储

7、是否具有本地存储

8、是否具有索引 DB

9、IE 是否指定 AddBehavior

10、是否有打开的 DB

11、CPU 类

12、平台

13、是否 DoNotTrack

14、已安装的 Flash 字体列表

15、使用 JS/CSS 检测到的字体列表(最多可检测到 Flash 之外的 500 种字体)

16、Canvas 指纹

17、WebGL 指纹

18、浏览器的插件信息

19、是否安装 AdBlock

20、用户是否篡改了语言

21、用户是否篡改了屏幕分辨率

22、用户是否篡改了操作系统

23、用户是否篡改了浏览器

24、触摸屏检测和能力

一般情况下,JS 字体检测最多可检测 65 种已安装的字体。用户可通过使用 extendedFontList: true 选项提升字体检测能力,可提升到 500 种。

更多指纹资源


1、多显示器检测

2、Silverlight 集成

3、Flash linux 内核版本

4、内部哈希表执行检测

5、WebRTC 指纹

6、Math 常数

7、可访问性指纹

8、相机信息

9、DRM 支持

10、加速器支持

11、虚拟键盘

12、手势列表(触摸设备)

13、像素密度

14、视频和音频编解码器的可用性

hash示例

Fingerprint2.get(options, function (components) {
    var values = components.map(function (component) { return component.value })
    var murmur = Fingerprint2.x64hash128(values.join(''), 31)
})

此时既可使用返回的hash作为匿名用户的特征码进行简易的判定!

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

脸朝大海, 春暖花开 ----江大脸