当前位置: 首页 > news >正文

基于设备指纹识别的反爬虫技术:给设备办 “身份证”

传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。

一、基础参数采集:构建设备指纹的 “骨架”

设备指纹的基础参数采集,是构建设备指纹的第一步,主要收集设备的浏览器信息、操作系统、屏幕特性等相对稳定的特征,为后续生成唯一标识奠定基础。

浏览器与操作系统信息

通过 navigator.userAgent 可获取浏览器的名称、版本以及操作系统的类型和版本等信息。这一参数能让我们初步了解用户的设备环境,例如是使用 Chrome 浏览器还是 Firefox 浏览器,操作系统是 Windows 还是 macOS。

// 获取浏览器和操作系统信息
const getBrowserAndOSInfo = () => {const userAgent = navigator.userAgent;// 对 userAgent 字符串进行简单解析,获取浏览器和操作系统信息let browserName = 'Unknown';let osName = 'Unknown';if (userAgent.indexOf('Chrome') > -1) {browserName = 'Chrome';} else if (userAgent.indexOf('Firefox') > -1) {browserName = 'Firefox';}if (userAgent.indexOf('Windows') > -1) {osName = 'Windows';} else if (userAgent.indexOf('Macintosh') > -1) {osName = 'macOS';}return { browserName, osName };
};

屏幕分辨率与时区

屏幕分辨率反映了用户设备屏幕的大小和显示精度,通过 screen.widthscreen.height 获取。不同时区的用户访问网站时,服务器接收到的请求时间会有所差异,通过 Intl.DateTimeFormat().resolvedOptions().timeZone 可获取设备所在时区,这有助于分析用户的地理位置信息。

// 获取屏幕分辨率与时区
const getScreenAndTimezoneInfo = () => {const screenWidth = screen.width;const screenHeight = screen.height;const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;return { screenWidth, screenHeight, timezone };
};

二、高级指纹生成:打造设备指纹的 “独特标识”

Canvas 指纹

Canvas 是 HTML5 提供的一个绘图区域,不同设备在渲染 Canvas 图形时会因显卡驱动、抗锯齿算法等因素产生细微差异。我们可以在 Canvas 上绘制一些图形,然后将绘制结果转化为一个哈希值,这个哈希值即为 Canvas 指纹。为了增加抗伪造能力,可以在绘制过程中加入一些随机因素,如随机像素偏移。

// 获取 Canvas 指纹
const getCanvasFingerprint = () => {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');// 设置 Canvas 尺寸canvas.width = 300;canvas.height = 200;// 绘制随机图形(包括随机像素偏移)ctx.fillStyle = '#FF0000';ctx.fillRect(10 + Math.random() * 5, 10 + Math.random() * 5, 50, 50);ctx.font = '16px Arial';ctx.fillStyle = '#0000FF';ctx.fillText('Hello, Fingerprint!', 70 + Math.random() * 3, 70 + Math.random() * 3);// 获取 Canvas 内容的 Base64 编码字符串const data = canvas.toDataURL();return data;
};

WebGL 指纹

WebGL 是一种基于浏览器的 3D 绘图技术,它可以访问设备的显卡信息。通过 WebGL,我们可以获取显卡的渲染器名称、厂商等信息,这些信息在不同设备上具有较高的唯一性。同时,还可以利用 WebGL 的计算特性,执行一些简单的计算任务,进一步增加指纹的复杂度。

// 获取 WebGL 指纹
const getWebGLFingerprint = () => {const canvas = document.createElement('canvas');const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');if (!gl) {return { renderer: 'No WebGL support', vendor: 'No WebGL support' };}const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);// 执行简单的 WebGL 计算任务,获取计算特性const computeResult = performWebGLComputation(gl);return { renderer, vendor, computeResult };function performWebGLComputation(gl) {// 创建一个简单的着色器程序const vertexShaderSource = `attribute vec4 aVertexPosition;void main() {gl_Position = aVertexPosition;}`;const fragmentShaderSource = `precision mediump float;void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}`;const vertexShader = gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(vertexShader, vertexShaderSource);gl.compileShader(vertexShader);const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(fragmentShader, fragmentShaderSource);gl.compileShader(fragmentShader);const shaderProgram = gl.createProgram();gl.attachShader(shaderProgram, vertexShader);gl.attachShader(shaderProgram, fragmentShader);gl.linkProgram(shaderProgram);// 执行绘图操作,获取计算结果(此处仅为示例,实际计算可更复杂)const positionBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);const positions = new Float32Array([0.0, 0.0, 0.0, 0.5, 0.5, 0.0]);gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);const vertexPositionAttribute = gl.getAttribLocation(shaderProgram, 'aVertexPosition');gl.enableVertexAttribArray(vertexPositionAttribute);gl.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);gl.useProgram(shaderProgram);gl.drawArrays(gl.TRIANGLES, 0, 3);// 获取绘图结果的哈希值作为计算特性的一部分const pixels = new Uint8Array(4 * 1 * 1);gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);return pixels[0].toString() + pixels[1].toString() + pixels[2].toString() + pixels[3].toString();}
};

三、行为特征融合:捕捉设备的 “动态特征”

除了设备的硬件和软件信息外,用户在使用设备时的行为特征也能为设备指纹提供重要补充。通过监听 mousemove、keydown 等事件,我们可以捕捉到用户与设备交互的模式,这些模式对于区分人机操作具有重要意义。

鼠标移动(mousemove)事件

用户在页面上移动鼠标时,会产生一连串的 mousemove 事件。我们可以记录鼠标的位置变化、移动速度以及停留时间等信息。正常用户的鼠标移动通常是比较自然和不规则的,而爬虫模拟的鼠标移动可能呈现出固定的模式或异常的速度。

// 监听 mousemove 事件并记录鼠标行为特征
let mouseMoveData = {path: [], // 鼠标移动轨迹speed: [] // 鼠标移动速度
};
document.addEventListener('mousemove', (event) => {const x = event.clientX;const y = event.clientY;const timestamp = Date.now();// 记录鼠标位置mouseMoveData.path.push({ x, y, timestamp });// 计算鼠标移动速度if (mouseMoveData.path.length > 1) {const prevPosition = mouseMoveData.path[mouseMoveData.path.length - 2];const deltaX = x - prevPosition.x;const deltaY = y - prevPosition.y;const deltaTime = timestamp - prevPosition.timestamp;const speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY) / (deltaTime / 1000); // 速度单位:像素/秒mouseMoveData.speed.push(speed);}// 限制数据长度,避免内存占用过多if (mouseMoveData.path.length > 100) {mouseMoveData.path.shift();}if (mouseMoveData.speed.length > 50) {mouseMoveData.speed.shift();}
});

键盘按下(keydown)和释放(keyup)事件

用户在输入文本时,按键的顺序、每个键的按压时长以及按键间隔等特征都能反映其操作习惯。我们可以通过监听 keydown 和 keyup 事件来记录这些信息。例如,不同用户在输入相同的密码时,按键节奏可能截然不同,这为区分正常用户和爬虫提供了有力依据。

// 监听 keydown 和 keyup 事件并记录键盘行为特征
let keyboardData = {keySequence: [], // 按键序列keyPressDurations: [] // 按键按压时长
};
document.addEventListener('keydown', (event) => {const key = event.key;const timestamp = Date.now();// 记录按键按下时间keyboardData.keySequence.push({ key, timestamp, releaseTime: null });
});
document.addEventListener('keyup', (event) => {const key = event.key;const timestamp = Date.now();// 查找对应的按键按下记录for (let i = keyboardData.keySequence.length - 1; i >= 0; i--) {if (keyboardData.keySequence[i].key === key && keyboardData.keySequence[i].releaseTime === null) {keyboardData.keySequence[i].releaseTime = timestamp;// 计算按键按压时长const pressDuration = timestamp - keyboardData.keySequence[i].timestamp;keyboardData.keyPressDurations.push(pressDuration);break;}}// 限制数据长度if (keyboardData.keySequence.length > 100) {keyboardData.keySequence.shift();}if (keyboardData.keyPressDurations.length > 50) {keyboardData.keyPressDurations.shift();}
});

四、设备指纹的应用场景

跨平台账号管理

在跨境电商平台中,设备指纹技术可以防止恶意用户通过创建虚假账号来进行欺诈活动。平台可以结合设备指纹、IP 地理信息和用户时区等多维度数据,对注册和登录的账号进行风险评估。如果发现一个账号在短时间内从不同设备指纹的设备登录,或者设备指纹与 IP 地理信息、时区不匹配,平台可以采取额外的验证措施,如发送验证码到绑定的手机号码,确保账号的安全性。

金融风控

银行系统在用户登录、转账等关键操作时,利用设备指纹技术可以有效识别异常设备登录。例如,如果一个用户的账号突然从一个从未使用过的设备登录,且该设备的指纹特征与之前常用的设备差异较大,系统可以暂时冻结该账号或要求用户进行身份验证。同时,结合用户的行为特征,如输入密码的键盘敲击模式、鼠标操作习惯等,可以进一步判断是否为用户本人操作,防范账号盗用和欺诈交易风险。

在线游戏反外挂

在线游戏行业一直受到外挂程序的困扰,这些外挂程序通常会模拟正常玩家的操作来获取不公平的优势。通过设备指纹识别技术,游戏平台可以对玩家的设备进行唯一标识,监测玩家的游戏行为是否与设备指纹对应的正常玩家行为模式相符。如果发现某个设备指纹的玩家频繁出现异常的游戏行为,如超高速移动、精准射击(不符合正常人类反应时间)等,平台可以对该账号进行封禁或限制,维护游戏的公平性和平衡性。

五、设备指纹技术的优势与挑战

优势

高准确性 :设备指纹能够综合多种硬件和软件特征,生成具有高度唯一性的标识,有效地区分不同设备,减少了误判的可能性。

难以伪造 :由于设备指纹涉及大量复杂的特征,包括硬件渲染差异、行为习惯等,爬虫很难完全模拟和伪造一个真实的设备指纹,从而提高了反爬虫的效果。

动态更新 :行为特征融合使得设备指纹可以根据用户的操作实时动态更新,即使爬虫获取了某个设备的静态指纹信息,在下一次请求时,由于行为特征的变化,仍然可以被识别出来。

挑战

浏览器限制与隐私问题 :随着浏览器隐私保护措施的加强,某些设备指纹采集技术可能会受到限制。例如,一些浏览器会禁止访问精确的硬件信息或对 Canvas 渲染结果进行干扰,这可能会影响设备指纹的准确性。同时,设备指纹技术涉及到收集用户的设备信息,可能会引发用户对隐私泄露的担忧,因此在使用该技术时需要充分考虑用户隐私保护,确保数据的合法收集和使用。

性能开销 :采集和处理设备指纹信息,尤其是高级指纹生成和行为特征融合部分,可能会对设备的性能产生一定影响。在一些低性能设备上,可能会导致页面加载变慢或卡顿。因此,需要优化算法和代码,尽量减少对设备性能的影响,确保用户体验不受损害。

设备指纹识别技术作为反爬虫领域的重要手段,为我们守护互联网数据安全提供了强大的支持。然而,它并非完美无缺,在实际应用中需要不断应对各种挑战,如浏览器限制、隐私保护和性能优化等。通过合理地使用设备指纹技术,并结合其他反爬虫手段,我们可以在保护数据安全的同时,为用户提供一个安全、可靠的网络环境。

相关文章:

  • vue3 全局注册自定义指令,input聚焦失焦展示对应值
  • NXP iMX8MP ARM 平台多屏幕克隆显示测试
  • kuka, fanuc, abb机器人和移动相机的标定
  • 对golang中CSP的理解
  • 学习记录:DAY28
  • 7.3.隐私合规
  • [春秋云镜] Brute4Road 仿真场景
  • 使用JMETER中的JSON提取器实现接口关联
  • ASP.NET中Tailspin Travel的UI层奥秘分析
  • 电机密集型工厂环境下的无线通信技术选型与优化策略
  • C++:书架
  • SPDK NVMe of RDMA 部署
  • 软考速通攻略之邪修提醒篇
  • 命名视图~
  • Node.js数据抓取技术实战示例
  • BERT模型讲解
  • AI汽车时代的全面赋能者:德赛西威全栈能力再升级
  • 【Python】超全常用 conda 命令整理
  • C++中static关键字详解:不同情况下的使用方式
  • 浏览器节能机制导致Websocket断连的坑
  • 巴基斯坦称对印度发起军事行动
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • “80后”赵亮出任上海普陀区委副书记
  • 中国词学研究会原会长、华东师大教授马兴荣逝世,享年101岁
  • 2025柯桥时尚周启幕:国际纺都越来越时尚
  • 甘肃省政府原副省长赵金云被决定逮捕