最近接手一个小功能, 系统允许匿名用户无验证的情况下进行某种点单行为, 说白了, 就是允许用户不经过验证提交表单 ! 很多人下意识会想到记录用户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作为匿名用户的特征码进行简易的判定!