解读 bot.sannysoft.com 和 CreepJS 到底检测了什么、如何看懂结果行,以及为什么通过测试不等于通过真实的检测系统。
搜索"我是不是机器人",两个名字总会反复出现:bot.sannysoft.com 和 CreepJS。两者都是免费、无需注册的页面,会运行一整套客户端检测并直接展示原始结果——没有隐藏的分数,也无需任何解释。它们在测试无头 CI 流水线的 QA 工程师中很受欢迎,也受到我们在机器人检测技术一文中提到的那些自动化工具作者的关注。本文将解释这两个页面各自检测什么、如何读懂一行结果,以及——重要的是——为什么在其中任何一个上拿到"全绿"并不等于通过了真正的生产级检测系统。
关键要点
- bot.sannysoft.com 会快速运行一张通过/失败的检测表,涵盖经典的自动化破绽:
navigator.webdriver、window.chrome对象、插件与权限检测,以及 WebGL 渲染器字符串。 - CreepJS 走得更深:这是一个开源项目,会通过多条独立代码路径交叉检查同一个浏览器属性,一旦某个隐身补丁改了一条路径却漏掉了另一条,就会被标记为"谎言(lie)"。
- 一行显示为绿色,只说明你的浏览器没有触发那一项特定的已知破绽——它无法说明你能否通过同时评估行为分析、TLS/HTTP-2 指纹和 IP 信誉的真实网站检测系统。
- 这两个工具都是独立的社区项目,并非任何浏览器厂商的官方产品,随着自动化框架的演进,它们的具体检测项也会不断变化。
- BrowserInsight 自家的机器人检测工具会为你当前的浏览器展示许多同类信号,并附带说明每一项的含义。
这些公开测试页到底检测了什么
这两个页面都不是商业产品——它们都源自同一批研究者社区,我们在无头浏览器检测一文中也记录了这个社区的工作;它们的目的,是让任何人都能快速、透明地看到"我的自动化浏览器到底泄露了什么"。
bot.sannysoft.com 是两者中更简单的一个:打开页面,它会渲染一张表格,每一行对应一个已知的自动化破绽,标为绿色(像人类)或红色(像自动化)。它会检查诸如 navigator.webdriver 是否返回 true、真实 Chrome 会暴露的 window.chrome 对象是否存在、navigator.plugins 的长度是否合理非零、Permissions API 返回的结果是否内部一致,以及 WebGL 渲染器字符串是否指向真实 GPU 硬件而非软件光栅化器。这些正是我们在机器人检测技术一文中更深入讨论过的分类——Sannysoft 的页面只是让你一眼就能在自己的浏览器上看到它们的实际表现。
CreepJS(源码见 github.com/abrahamjuliot/creepjs)是一个规模大得多、MIT 许可的开源项目,专门用来抓住伪装和隐身工具,而不只是未打补丁的裸自动化。它不只是读取一次某个属性值,而是通过几条独立的代码路径——原型链、Web Worker 的隔离作用域、iframe 的独立全局对象——读取同一个值并进行比较。真实且未被修改的浏览器在每条路径上给出的答案都一致。如果某个隐身补丁在主线程上覆盖了 navigator.webdriver,却忘了在 worker 内部做同样处理,就会产生 CreepJS 标记为"谎言"的不一致。正是这种跨路径比对,让 CreepJS 对于那些专门试图伪造指纹(而非仅仅运行未打补丁的自动化)的人来说,比 Sannysoft 的页面更难蒙混过关。
逐行读懂检测结果
两个页面表达的核心思路相同——观察值与真实浏览器的预期值对比——但呈现方式不同。
在 Sannysoft 的表格中,每一行都会给出检测名称并按判定结果着色。真正值得留意的几行包括:WEBDRIVER(在真实浏览器上应为 false 或缺失)、CHROME 行(真正的 Chrome 会暴露一个非空的 window.chrome 对象,许多自动化环境不会)、PLUGINS-LENGTH(一台真实的桌面 Chrome 安装通常会报告一个小而非零的插件列表)、PERMISSIONS 行(检查查询到的权限状态是否内部一致,而非相互矛盾),以及 WebGL vendor/renderer 那几行(软件渲染器如 SwiftShader,而非真实 GPU 名称,是最强的单一破绽之一,我们在无头浏览器检测一文中也有介绍)。
CreepJS 会在顶部展示一个综合的信任分数,然后按类别拆分结果,把具体属性单独标记为一致或被检测出"谎言"。单独一条被标记的"谎言"往往比综合分数更有信息量——它能准确告诉你哪一层伪装没能覆盖到每一条代码路径,这对于调试自己的自动化配置比只看一个总分更有用。
请把这两个页面都当作在持续维护的项目:它们具体的行名、分类和评分方式会随着维护者添加针对新发现破绽的检测项而变化,所以本文说明的是底层的信号分类,而不是针对某一个版本的固定手册。
哪些信号重要,哪些只是噪声
不是每一行的权重都相同:
| 信号 | 权重 | 原因 |
|---|---|---|
navigator.webdriver === true | 强 | 真实浏览器从不报告这个值;只有未打补丁的 WebDriver 会话才会 |
| WebGL 渲染器是软件光栅化器 | 强 | 想要伪造需要真实的 GPU 访问权限,而大多数自动化环境都没有 |
| CreepJS 标记的属性"谎言" | 强 | 一种内部不一致,真实且未被修改的浏览器结构上不可能产生 |
| 插件列表为空或很短,单独来看 | 弱 | 隐私浏览器和现代 Chrome 版本也会主动缩短这份列表 |
| 缺失旧版 API(例如 Battery Status) | 弱/噪声 | 出于隐私原因,真实浏览器也在越来越多地移除或限制它,与自动化无关 |
规律很清晰:需要伪造浏览器如何渲染或暴露其自身内部结构的信号很难伪造,因此也更有意义;而一台正常、注重隐私的浏览器本身也可能触发的信号,单独看则较弱——这正是我们在机器人检测技术一文中区分"单一信号"与"组合打分"的原因。
这些测试页与网站真实检测系统的区别
无论是 Sannysoft 还是 CreepJS,单次页面加载所能测量的,永远只是静态页面能观察到的内容:这一个浏览器、这一次请求、此时此刻。而一套生产级检测系统会观察得多得多——整个会话中的鼠标与键盘时序、JavaScript 层之下的 TLS 与 HTTP/2 握手指纹、IP 信誉与请求速率,以及某个指纹长期与其他上千名访客相比呈现出怎样的聚类。这些都不会出现在单页测试中,因为它们需要浏览器端页面根本没有的历史数据和网络层可见性。
这意味着,在两个测试页上都拿到"全绿",说明你的配置避开了那些广为人知的静态破绽——这对于审计 CI 流水线或自动化工具的人确实很有用——但这并不能证明你能通过一套真实的商业反机器人系统,因为那些系统恰恰叠加了静态页面无法看到的信号。如果你的自动化浏览器还需要一个可信的 User-Agent,我们关于检测 User-Agent 伪造的文章介绍了与上述内容并行运作的请求头和 Client Hints 层面的检测。
用 BrowserInsight 检测你自己的浏览器
如果你想看到这些信号针对你当前的浏览器给出的解释,而不是一张干巴巴的通过/失败表格,BrowserInsight 的机器人检测工具会报告你的 navigator.webdriver 状态、插件与权限一致性,以及 WebGL 渲染器——每一项都配有通俗易懂的说明,且全部在客户端计算完成。
常见问题
Sannysoft 和 CreepJS 是 Google 或浏览器厂商的官方工具吗?
不是。两者都是独立的社区项目,与任何浏览器厂商无关。它们在机器人检测与自动化工具社区中被广泛用作非正式、透明的参考检测——而不是对任何事物的官方认证。
如果我在 CreepJS 上拿到高信任分数,就能避免被真实网站封锁吗?
不一定。高信任分数只说明你的浏览器没有触发 CreepJS 运行的那些特定检测项。真实网站的反机器人系统还会对行为、网络指纹、IP 信誉以及跨多次请求的历史进行打分,而这些都不是单次测试页面加载能评估的。
为什么 Sannysoft 和 CreepJS 对同一个浏览器有时会给出不同结论?
因为它们检测的深度和内容不同。Sannysoft 关注一小组经典且广为人知的破绽;CreepJS 则跨多条独立代码路径交叉检查大量属性,专门用来抓住那些已经能骗过简单检测的伪装。同一套配置可能在一个页面上显示干净,却在另一个页面上被标记出来。
用这些页面测试自己的自动化配置是否合规?
是的——这正是它们最常见的用途之一。在 CI 中运行无头浏览器的 QA 团队,以及研究检测技术的研究者,都会用这些页面提前看看目标网站的检测层可能会注意到自己配置的哪些地方,而不必等它真正上线才发现问题。


