7.2 KiB
7.2 KiB
高强度浏览器环境检测通用排查指南
本文件用于从 Cloudflare / Turnstile / Akamai / DataDome / Kasada / Shape / F5 等高强度检测样本中抽象通用补环境要求。它不是任何厂商的专用绕过流程,也不用于生成或伪造 challenge、验证码、访问控制 Cookie 或第三方防护 token;只用于授权范围内的网页端 Node.js 补环境、取证一致性检查和最终请求链验证。
触发条件
出现以下任一现象时读取本文件,并把结论写入阶段报告:
- HTTP 403 / 429 / 503、challenge 页面、security check、bot block、verify、captcha、WAF / risk control 页面。
- HTML 中注入 challenge / detection / telemetry / fingerprint 脚本,或目标 API 依赖入口页 Cookie、Storage、seed、nonce、动态 JS。
- 目标 JS 访问大量环境 API、指纹 API、自动化检测 honeypot,或 trace 中 API 类别分散。
- 单独请求 API 失败,但真实浏览器从入口页访问后成功。
- 请求成功依赖 UA / Client Hints / CookieJar / Storage / TLS / 代理 / 请求顺序一致。
非目标
不得把本文件解释为:
- 生成或伪造
cf_clearance、__cf_bm、验证码 token、Turnstile token、设备校验 token 或访问控制凭证。 - 自动破解验证码、绕过登录、绕过 MFA 或绕过访问控制。
- 把浏览器自动化作为最终交付项目的一部分。
- 主动分析 JSVMP opcode / 字节码源码;遇到 JSVMP 只围绕环境调用、writer、行为 diff 和请求链推进。
高强度检测面总览
| 类别 | 重点排查 | 通用处理原则 |
|---|---|---|
| 环境真实性 | 原型链、属性描述符、getter/setter、非法构造、brand check、枚举顺序、Error stack、DataCloneError、toString 多通道 | 按 env-object-model.md、env-native-protection.md、addon-api.md,addon-first / xbs native-first |
| 指纹值 | Canvas、WebGL、WebGPU、Audio、Speech、Fonts、DOM geometry、Permissions、Plugins、MimeTypes、MediaDevices、WebRTC、screen、UA-CH | fingerprint-value-replay.md:Trace 未截断优先,截断 / 缺失则真实浏览器采样,禁止 AI 猜值和随机化 |
| 自动化痕迹 | navigator.webdriver、Selenium / PhantomJS / NightmareJS / ChromeDriver 痕迹、CDP / DevTools 侧信道、headless 差异、isTrusted |
从第一次取证起使用用户确认的 ruyiPage / Camoufox / CloakBrowser / 手动浏览器,固定 baseline |
| 浏览器状态 | Cookie、localStorage、sessionStorage、IndexedDB、Cache、ServiceWorker、权限状态、visibility、focus、history | 入口页优先,记录生成 / 刷新链路,不把过期状态误判为补环境失败 |
| 网络一致性 | TLS JA3/JA4、HTTP/2、Header 顺序、Accept-Encoding、UA、UA-CH、Sec-Fetch、Referer、Origin、Accept-Language、代理地区 | tls-request-validation.md + session-request-chain.md,最终请求使用 Session + TLS 指纹兼容客户端 |
| 请求链与时序 | 入口 HTML、动态 JS、检测脚本、前置接口、目标 API、请求间隔、Cookie 变化 | 不孤立重放单个 API,保存 request-chain manifest 与失败排查结论 |
入口页优先原则
高强度检测下,单个 API cURL 通常不是完整状态来源。进入补环境前必须确认:
- 入口 HTML URL 与目标 API URL 的关系。
- 入口页是否注入检测脚本、动态 seed、nonce、challenge 资源或 Set-Cookie。
- 目标 API 是否依赖入口页产生的 Cookie / Storage / JS runtime 状态。
- 是否存在动态 HTML / JS 资源过期风险,必要时按
dynamic-resource-freshness.md在最终入口运行时刷新。 - 如果用户只提供 API cURL 且返回风控 / challenge,应暂停要求入口页、HAR、浏览器取证证据或用户确认无法提供,不得直接盲补 API 参数。
指纹值不能随机化
高强度检测中,随机化或伪装不一致的 Canvas / WebGL / Audio / 字体 / DOM 几何结果,可能比固定真实值更容易暴露。硬性规则:
- 不使用
Math.random()、时间戳、机器默认值或 AI 经验生成指纹结果。 - 不把
node-canvas、headless-gl、jsdom等 Node 模拟库结果当最终真实值。 - 不每次取证生成一套新 UA / 语言 / 时区 / screen / WebGL / Canvas / Audio 指纹。
- 优先 RuyiTrace / trace 未截断值;trace 缺失、未覆盖或疑似截断时,用用户确认的取证工具在同一
baselineId下采样。 - 每条 fixture 记录
source / capturedBy / traceStatus / baselineId / valueLength / hash / truncated。
自动化与 CDP 风险清单
取证阶段出现以下信号时,不要继续普通自动化路径,应回到 browser-acquisition.md 重新确认工具和 baseline:
navigator.webdriver、window._selenium、window.callSelenium、window.callPhantom、window._phantom、window.__nightmare、window.domAutomation、window.domAutomationController。HeadlessChromeUA、无插件 / 无 mimeTypes / permissions 异常、WebGL / Canvas 被隐私插件随机化或伪装。- CDP / DevTools / Runtime 侧信道、异常
console/ stack 行为、被页面检测到调试器或自动化 hook。 - 普通
dispatchEvent产生isTrusted=false,或鼠标 / 键盘 / 拖拽轨迹不可信。 - Profile 为空导致 Cookie / Storage / 权限状态缺失,或每次启动工具重新随机指纹。
高强度失败排查顺序
遇到最终请求失败、参数不一致、403 / 429 / 风控页、静默失败时,按以下顺序排查,不要直接反复改补环境代码:
- 是否拿到 challenge / 风控页而非业务页。
- 是否缺少入口 HTML、前置 JS、检测脚本或前置接口请求。
- Cookie / Storage / device token / challenge 状态是否过期、缺失或不属于同一 session。
- UA、UA-CH、Accept-Language、timezone、locale、screen、WebGL、Canvas、代理 / IP 是否与取证 baseline 一致。
- TLS JA3/JA4、HTTP/2、Header 顺序、Sec-Fetch、Referer、Origin 是否与浏览器取证链一致。
- fingerprint fixture 是否混用 baseline,trace 中长字段是否被截断。
- Canvas / WebGL / WebGPU / Audio / Speech / Fonts / DOM geometry / Permissions / Plugins / MimeTypes 是否缺失真实样本或被随机化。
- 取证阶段是否暴露 webdriver / CDP / headless / isTrusted 风险。
- 请求顺序、请求间隔、Cookie jar 回写、动态资源刷新是否完整。
- 以上排除后,再判断目标 JS 补环境对象、入口、writer 或 signer 逻辑是否缺失。
输出要求
阶段报告、case/notes/high-intensity-env-diff.md、case/notes/final-request-validation.md 和最终总结至少记录:
- 是否触发高强度检测通用排查,触发证据是什么。
- 入口页、目标 API、动态资源、Cookie / Storage、请求链是否完整。
- 指纹 baseline 与 fixture 来源,是否存在随机化、猜值或 trace 截断。
- 自动化 / CDP / headless / isTrusted 风险检查结果。
- TLS / Header / Client Hints / Session 请求链一致性检查结果。
- 失败排查顺序执行结果,以及最终认为是环境问题、请求链问题、状态过期、取证工具问题还是目标 JS 逻辑问题。