CreepJS Math 信号:读取字段来源
拆解 CreepJS 的 Math 结果、浏览器参考标记、重复调用和 lie 状态,不把源码标签当成实时浏览器证据。
BotBrowser Team
CreepJS 的 Math 报告包含回答不同问题的字段。数值结果来自一个表达式;浏览器家族布尔值把结果和固定版本源码中的常量比较;重复调用检查同一调用是否稳定;lieProps 则提供继承的状态。把这些字段读成一个分数,会把源码元数据变成模块并未声明的结论。BotBrowser 支持按 profile 配置可见的指纹面,但不能决定外部 CreepJS 版本如何标记结果。
TL;DR
- 固定版本的
src/math/index.ts执行选定函数,并用表达式文本作为输出键。 chrome、firefox、torBrowser和safari是与源码参考值的比较,不是当前浏览器家族的实测证明。- 重复调用和继承的
lieProps.Math.*来自两条不同路径。 - 缺失或阻断的值只说明输出路径,不能说明人、设备或 bot 结论。
- 复核时应记录 commit、文件和行号。
Contents
固定源码与输入
公开源码版本为 10aa6724cd33a1015db1574211890518cd04f0cc。在 src/math/index.ts 中,check 列表列出 23 个 Math 方法,包括 acos、cos、hypot、sin、sqrt 和 pow。第一轮读取 lieProps[Math.<method>],用固定参数调用函数两次并比较结果。两个 NaN 被视为相同;其他值使用相等比较。出现差异时,局部 lied 会被设置并调用记录函数。
第二张表用途不同。它包含 cos(Math.PI)、pow(Math.SQRT2, -100) 等表达式。每一行有一个期望值,以及可选的 chrome、firefox、torBrowser 和 safari 值。这是表达式到参考槽位的映射,并不表示当前请求真的在这些浏览器中运行过;源码也没有在每行记录产生常量的操作系统和版本。
这些行不是均匀样本。cos 使用大数和 Math.E、Math.LN2 等常量;hypot 使用两个或六个参数;pow 使用多个底数和 -100 指数。把它们合成一个 Math 分数会丢掉输入形状。表达式本身就是证据的一部分。
重复调用列表和参考表也不一定使用相同参数。例如第一次 cos 重复检查使用 1e308,参考表还会使用 0.123、Math.PI 等表达式。重复检查通过,不能说明另一行会匹配参考常量。下游记录应将两种检查分开。
ECMAScript Math 对象规范定义语言语义,但不会把 CreepJS 的常量变成当前兼容性保证。解释结果时要同时保存表达式、参数和源码 commit。
四类 Math 输出
data 对象使用表达式文本作为键,值由 attempt() 生成。普通行中的 result 是计算结果,四个浏览器名称是布尔比较。它们回答“结果是否等于源码中的这个参考槽位”,而不是“用户正在使用哪种浏览器”。匹配多个槽位或一个槽位都不能推出浏览器身份。
局部相等检查是另一条信号。部分函数会用相同参数调用两次。差异只说明这条检查看到不稳定,源码没有解释原因。记录函数、参数、可见的两个值和固定版本;单独的 lied 布尔值无法保留这些细节。
继承的 Math 状态来自 lieProps,由独立的 lies 模块维护;该模块还会扫描 Math 方法。它们是相关但不同的生产者。应分别记录“方法已经被标记”“重复调用不同”和“结果匹配参考值”。CreepJS 信号组文章解释一般限制,不替代本页的字段来源追踪。
| 字段或路径 | 固定源码中的生产者 | 可以安全表达 | 无法证明 |
|---|---|---|---|
result | Math[fn] 或 polyfill 表达式 | 指定输入的返回值 | 人或设备身份 |
| 四个浏览器标记 | 与行内参考值相等 | 与源码标签的比较 | 当前家族或版本 |
局部 lied | lieProps 与重复调用差异 | 记录了继承或局部问题 | 原因和修改者 |
attempt 的 undefined | 回调异常或不可用 | 没有返回值 | 具体失败原因 |
| 模块结果缺失 | 外层模块错误 | 没有返回普通对象 | 所有 Math API 都缺失 |
为什么要保留单行来源
方法列表包含 acos、acosh、asin、asinh、atan、atanh、atan2、cbrt、cos、cosh、expm1、exp、hypot、log、log1p、log10、sin、sinh、sqrt、tan、tanh 和 pow。保存方法名,才能把差异和对应规范、参数联系起来。
参数也说明每行覆盖的数值区域。cos(1e308) 使用很大的输入,atanh(0.5) 使用内部值,atan2(1e-310, 2) 使用极小分量,hypot(1, 2, 3, 4, 5, 6) 使用多个操作数。这些例子只描述源码选择的场景,不解释实现为何返回该数值。真正的产品诊断仍需要相同构建和应用上下文的受控复现。
有些常量只在最后几个可表示位上不同。例如 atan(2) 的一个值是 1.1071487177940904,另一个可选参考是 1.1071487177940906。这不是通用容差规则。是否精确比较、使用容差或采用业务范围断言,应由 ECMAScript 语义和应用需求决定。
参考数组中的 NaN 槽位可能表示该源码没有提供该列的数值参考,不是实时 Firefox、Tor Browser 或 Safari 返回了 NaN。比较器会把空参考当作不匹配。应记录“该源码行没有参考”,不要写成“这个浏览器返回 NaN”。
页面显示的短 hash 和 lied 只是展示选择,不是证明两个会话属于同一人的加密凭证。支持工单应保留源码版本和最小相关行,而不是完整指纹字符串。
缺失、阻断与继承状态
attempt() 会把回调异常转成不可用值。因此 undefined 可能来自抛错、方法缺失或其他调用边界;显示字段不保留异常分类,不能猜测浏览器标签。
getMaths() 还有外层 try/catch。错误越过单行回调时,整个模块记录失败并不返回普通对象。这和单行缺失不同。阻断卡片也可能来自模块缺失、字段缺失或渲染分支。记录时要区分这些状态。
浏览器名称是源码中的历史参考标签,不是 benchmark。不同 Chromium 版本、profile 设置或 CreepJS commit 可能产生不同结果,同时仍符合规范。JavaScript Math 一致性文章解释应用级容差和操作规则,不能替代本页的来源判断。
固定输入也不是现实应用工作负载的随机样本。它们由源码作者选择,不说明应用调用分布、精度需求或用户可见效果。遇到产品缺陷,应把案例缩小到最小可复现输入,再查对应 ECMAScript 条款;这组样本不能替代应用验收测试。
参考常量绑定到源码 commit,但每行没有绑定产生它的构建和操作系统。比较不同日期的报告前先比较模块和辅助代码。如果来源没有写明,结论应是“该源码未说明”,而不是猜测。
来源矩阵
| 复核行 | 记录内容 | 选择规则 |
|---|---|---|
| 来源身份 | commit 10aa6724…、文件和行号 | 没有生产者就不下解释 |
| 输入 | 表达式和参数 | 只比较相同输入 |
| 计算输出 | result、undefined 或模块缺失 | 保留未知,不推断原因 |
| 参考比较 | 为真的浏览器标记 | 只称源码匹配,不称身份 |
| 重复检查 | 方法和调用是否相等 | 与参考比较分开 |
lied 来源 | 继承 lieProps 或局部差异 | 写明路径,不合成分数 |
| 保留策略 | 工单 ID 和删除日期 | 只保留支持所需的最少证据 |
不同源码路径应分开记录。cos(Math.PI) 的参考行在源码第 86 行,包含 result=-1 和相应的浏览器家族布尔值;它不包含重复调用结果。重复调用检查使用 cos(1e308),位于第 42-49 行,因此应先分别记录两次调用的结果,再推导 repeatMatch。lieProps.Math 是当前存在的疑点键集合,不是源码形状的 Math.cos=false;键缺失不等于记录了 false。这些记录都不能识别访客使用的浏览器,也不能预测外部服务的决定。
比较两份报告时,先固定相同 commit,再匹配表达式和参数,然后比较 result、参考标记和 lied 的来源。commit 或输入不同,就不是受控比较。参考布尔值依赖同一个结果,lied 读取另一状态;把它们当作三个独立票数会夸大证据。
BotBrowser 可以记录授权比较所用的 profile,但不能控制外部模块版本,也不能保证其分类。profile 配置、源码检查和应用结果应存为三份记录。没有必要时不要添加 cookies、浏览历史或账户信息。
FAQ:CreepJS Math 字段
chrome 和 firefox 会识别当前浏览器吗?
不会。它们只是和固定源码中的常量比较。
lied: true 是否等于 Math 测试失败?
不等于。它可能组合继承的 lieProps 和重复调用差异。
undefined 能说明哪个 API 失败吗?
不能。需要独立诊断来区分异常和 API 缺失。
参考表是不是跨浏览器 benchmark?
不是。它是特定源码版本声明的比较常量。
Practical conclusion
固定 CreepJS commit、表达式和参数,把 result、参考标记、重复调用和 lied 来源分开保存。把阻断和缺失路径当作未知。这样可以审计公开报告,而不会把源码标签当成人的身份或安全判断。单项信号结果合并展示时,可参照 CreepJS 预测聚合分析追踪候选项缩减与渲染状态,同时避免把它们当作身份依据。
Public sources
本文属于指南: 什么是浏览器指纹?原理、风险、信号与隐私边界