在当今的技术世界中,反欺诈系统变得越来越复杂。除了使用画布外,用户代理和浏览器内存容量等参数也被广泛用于唯一识别用户和检测欺诈活动。让我们来详细了解一下这些参数。 #### User-Agent 的历史和目的 User Agent 是浏览器在 HTTP 请求中发送给服务器的字符串,其中包含有关设备类型、操作系统、浏览器及其版本的信息。 在早期互联网时代,User Agent 用于使网页内容适应不同的设备。如今,它不仅用于显示网页,还用于反欺诈系统。 ###### 使用 User Agent 的地方 - 主浏览器线程:** 用户代理字符串可通过 navigator.userAgent 获取。它通常被解析为主要设备标识。 - 网络工作线程:** 在工作线程中,对用户代理的访问是有限的,但通过 navigator.userAgentData 等 API 可以检索平台信息。 - 服务工作者:** 与 Web 工作线程类似,服务工作线程也能间接处理用户代理,但直接分析需要主线程。 - **HTTP 请求:** 用户代理服务器端处理允许你识别设备并验证它们是否与其他参数相匹配。 ###### 用户代理问题和欺骗 攻击者可以通过浏览器设置或使用反检测浏览器修改用户代理。这会造成识别困难,但现代反欺诈系统会使用与其他参数(如 IP 地址或 Canvas 和 WebGL 指纹)的相关性。 让我们举例说明用户代理字符串的样子,在浏览器中打开 browserleaks.com/ip 页面:  用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 ###### 用户代理字符串由哪些数据组成? 根据规范的一般格式: 用户代理: 产品/版本(系统和浏览器信息) 引擎/版本(引擎信息) 浏览器/版本 1. **产品/版本** - 软件产品及其版本的标识符 例如:Mozilla/5.0 1. **附加平台信息** 例:(Windows NT 10.0;Win64;x64) - 平台类型 - 操作系统标识符 例如:Windows NT 10.0 - 架构 - 系统架构信息 例如:Win64;x64 3. **引擎/版本** - 渲染引擎 ID 和版本 例如:AppleWebKit/537.36 4. **兼容性信息** 例如:(KHTML,如 Gecko) 5. **浏览器信息** - 浏览器 ID/版本 例如:Chrome/131.0.0.0 Chrome/131.0.0.0 6. 声称兼容的**兼容性标记/版本** - 与其他浏览器兼容的信息 例如:Safari/537.36 这是移动设备上 Chrome 浏览器的用户代理字符串:  请注意,用户代理字符串是反欺诈系统的主要信息,使用其他应用程序接口从用户浏览器中收集的大量数据都要与用户代理字符串中获得的信息进行比较,以确定是否一致。 上文我们举例说明了从传输的 http 头信息中获取用户代理的方法。反欺诈系统还可以使用 JavaScript 获取浏览器信息。让我们打开browserleaks.com/javascript/页面,看看从浏览器中获取的信息:  在此页面上,网站使用两种不同的 API 获取有关用户浏览器和系统的信息:传统的 Navigator API 和现代的 User Agent Client Hints API。 让我们比较一下从 Chrome 浏览器(左)和 Firefox 浏览器(右)获取的信息:  从这个例子中我们可以看出,两种浏览器之间存在着明显的差异:返回的信息量、信息格式以及火狐浏览器对用户代理客户端提示API支持的局限性。我们可以得出结论,反欺诈系统很容易检测到用户代理字符串与浏览器引擎之间的不匹配。让我们以这种替换为例,比较一下火狐浏览器(左)和基于Chromium的反检测浏览器(右)的信息:  替换后,BuildID、oscpu 值在反检测浏览器中不匹配,而且与火狐浏览器不同,火狐浏览器支持用户代理客户端提示 API。这样的替换会很快被反欺诈系统发现。 让我们在Chrome浏览器中打开测试页面test-webapi.tech/ua,看看反欺诈系统还能使用哪些其他方式获取用户代理:  在本例中,我们从主浏览器流、Web Worker 和 Service Worker 的 http 头中获取用户代理信息和用户浏览器信息,并对结果进行比较:  通过用户浏览器的用户代理,反欺诈系统可以获得设备是否为移动设备、逻辑处理器内核数量、设备内存容量以及设备支持的同时触摸点数量等信息。让我们在测试页面上仔细看看这些参数:  在主线程数据部分,请注意 **“sec-ch-ua-mobile”**: “?0" - 从 http 标头获取的信息,表明我们使用的是桌面浏览器 “maxTouchPoints": 0 - 表明我们的设备不支持触摸功能 **“hardwareConcurrency ”**: 12 - 表示浏览器可用的逻辑处理器内核数量 **“设备内存 ”**: 8 - RAM 的大致容量(千兆字节)。 **“移动 ”**:false - 通过用户代理客户端提示 API 获取的信息表明我们的设备不是移动设备。 #### 浏览器内存。 ###### 分配的内存及其测量 浏览器内存参数(deviceMemory、performance.memory)提供有关设备可用内存的信息。例如 - navigator.deviceMemory 返回以千兆字节为单位的内存量。 - 主线程中的 performance.memory 提供当前内存使用情况的准确信息。 ###### antifrod 如何使用内存 1. **设备识别:**。 不同设备分配内存的方式不同。例如,移动设备的内存通常比台式机少。 2. **交换测试:** 将声称的内存与实际使用情况进行比较,有助于检测参数是否被篡改。 ###### 内存欺骗方法 - 隐藏真实值:** 攻击者可以使用浏览器扩展来更改 deviceMemory 值。 - 歪曲性能数据:** 例如,返回看起来可信但与实际设备参数不符的值。 让我们查看测试页面,了解有关信息: - jsHeapSizeLimit** - 可分配给 JavaScript 的最大内存大小 - totalJSHeapSize**-已分配内存的总大小 - **usedJSHeapSize** - 实际使用的内存大小。  在主**线程数据 - 内存分析**部分,我们将检查浏览器的内存大小,并以较小的间隔请求进行 3 次测试。 让我们尝试在移动设备上通过这项测试:  我们可能会注意到,移动浏览器会将给出的值四舍五入。 让我们使用移动设备配置文件在反检测浏览器中重复测试:  反检测浏览器只正确替换了一个 jsHeapSizeLimit 属性的值,其他属性值的格式仍与桌面浏览器的格式相似。这样一组值可能会触发反欺诈系统。值得注意的是,并非所有浏览器都支持 performance.memory 属性,如果将用户代理替换为不支持这些属性的浏览器,成功检测到此类属性也会引起反欺诈系统的怀疑。 ###### 以亚马逊为例说明用户代理 以亚马逊网站为例,我们来看看该网站接收了哪些有关用户代理的信息。 我们来看看在 http 头信息中传递的信息:  网站从 http 标头中获取了以下有关用户设备的信息: device-memory: 8 sec-ch-device-memory: 8 sec-ch-ua: “Google Chrome”;v=“131”, “Chromium”;v=“131”, “Not_A Brand”;v=“24”。 sec-ch-ua-mobile: ?0 sec-ch-ua-platform: “Windows” (视窗) sec-ch-ua-platform-version: "10.0.0” user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 现在,让我们使用 JavaScript 查看一下该网站获得了哪些与用户代理相关的信息:  该网站获得了关于浏览器、浏览器版本、浏览器供应商、平台、内存大小、设备上的触摸支持、使用不同 API 的 CPU 内核数的详细信息。 #### 结论 用户代理和浏览器内存是反欺诈系统中用户唯一性的关键参数。将它们与其他因素(如画布指纹和其他应用程序接口)结合使用,可以创建可靠的算法来检测欺诈活动。 *Bannykh M.V.*