如何在2025年检测 Browser-as-a-Service Scrapers
Source: Dev.to
请提供您希望翻译的完整文本内容,我将按照您的要求将其翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!
浏览器即服务的崛起
BaaS 平台到底做什么
浏览器即服务平台提供云托管的浏览器基础设施,以实现大规模自动化。不同于发送原始 HTTP 请求的传统爬虫工具,BaaS 平台运行真实的 Chromium 浏览器,能够:
- 执行 JavaScript
- 渲染页面
- 像合法用户一样保持会话
2025 年主要玩家
| 平台 | 融资 / 状态 | 关键特性 |
|---|---|---|
| Browserbase | $67.5 M 总融资(市场领袖) | 托管的无头浏览器、会话持久化、代理支持、用于 AI 代理的 Stagehand SDK。被 Perplexity、Vercel、11x 使用。 |
| Skyvern | Y Combinator 支持 | 将计算机视觉与 LLM 结合;在 WebBench 基准上达到 64.4 % 的准确率;擅长表单填写、登录自动化、RPA。 |
| Hyperbrowser | 私募轮融资 | “专为在具备高级检测系统的网站上运行的 AI 代理而构建”。侧重隐蔽性、持久性和不被检测。 |
| Browser Use | 开源 | 可与各种 AI 框架集成的自动化原语。 |
不舒服的事实: 传统的机器人检测无法捕捉它们。
但 行为分析可以。
商业模式:隐身即特性
这些平台在规避检测能力上展开竞争。
- Browserbase: “使用隐身机制来避免机器人检测。”
- Hyperbrowser: “旨在保持不被发现,并在长期内维持稳定会话,即使在采用激进反机器人措施的网站上也是如此。”
隐身即产品。
BaaS 平台如何规避传统检测
去除 navigator.webdriver
// What detection checks for
if (navigator.webdriver === true) {
flagAsBot();
}
// How BaaS platforms evade
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
动态 User‑Agent 生成
来自 Stytch 的研究表明,Browserbase 会在每个会话中生成略有不同的 user‑agent——有时与底层 Chromium 运行时相匹配,有时则故意欺骗。这会产生可检测的不一致:user‑agent 可能声称是 Chrome 120,而 TLS 指纹却揭示了真实的 Chromium 版本。
修补 JavaScript API
// Chrome object spoofing
window.chrome = {
runtime: {},
loadTimes: function () {},
csi: function () {},
app: {}
};
// Plugins array spoofing
Object.defineProperty(navigator, 'plugins', {
get: () => [
{ name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },
{ name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' },
{ name: 'Native Client', filename: 'internal-nacl-plugin' }
]
});
Puppeteer‑Stealth 包含 17 个独立的规避模块;BaaS 平台在此基础上加入了专有的改进。
为什么隐身模式在行为分析面前失效
BaaS 平台已经解决了 静态指纹 问题,但它们无法完全模拟 人类行为。
鼠标移动熵
人类的鼠标移动是混沌的:超出、修正、不规则加速度以及曲线路径。自动化往往高效且线性。
| 指标 | 人类 | BaaS 自动化 |
|---|---|---|
movement_count | 147 | 8 |
linear_path_ratio | 0.12(大多为曲线) | 0.91(直线) |
velocity_variance | 0.84(高度可变) | 0.08(恒定) |
overshoots | 4 | 0 |
即使使用 “类人” 随机化,统计分析仍能揭示合成模式。
点击时序分布
人类的反应时间呈右偏分布(≈ 200‑400 ms)。自动化点击始终更快且波动更小。
// Human click timing (ms from target appearing)
[247, 312, 289, 198, 267, 334, 223, 278, 301, 256]
// Mean: 271 ms, Std Dev: 42 ms
// BaaS automation click timing
[150, 180, 160, 170, 155, 175, 165, 145, 185, 158]
// Mean: 164 ms, Std Dev: 13 ms — too consistent
蜜罐链接有效性
<a href="/admin/backup" style="display:none;">Admin Backup Portal</a>
解析 DOM 的自动化会点击此链接,从而暴露自身。
实际有效的检测技术
TLS/JA3/JA4 指纹识别
每一次 TLS 握手都会暴露真实的客户端身份。密码套件、它们的顺序、扩展以及协议版本共同构成唯一的指纹。
Real Chrome 120 JA4:
t13d1517h2_8daaf6152771_b0da82dd1658
Browserbase session claiming Chrome 120:
t13d1516h2_8daaf6152771_a9f2e3c71b42
// 不同的哈希揭示不同的 TLS 堆栈
即使 User‑Agent 声称是 Chrome 120,TLS 指纹仍能显示实际的 Chromium 版本。两者不匹配就是强烈的机器人信号。(深入了解 TLS 指纹识别)
浏览器功能验证
声明的浏览器应当支持特定的功能:
// 如果 User-Agent 声称是 Chrome 120
const expectedFeatures = {
'Array.prototype.toSorted': true, // Chrome 110 添加
'Array.prototype.toReversed': true, // Chrome 110 添加
'structuredClone': true, // Chrome 98 添加
};
for (const [feature, expected] of Object.entries(expectedFeatures)) {
const actual = eval(`typeof ${feature} !== 'undefined'`);
if (actual !== expected) {
flagAsInconsistent('capability_mismatch', feature);
}
}
JavaScript 环境一致性
Stealth 补丁会留下痕迹:
// 检查 navigator.webdriver 是否被补丁修改
const descriptor = Object.getOwnPropertyDescriptor(navigator, 'webdriver');
if (descriptor && descriptor.get &&
descriptor.get.toString().includes('undefined')) {
flagAsStealth();
}
// 检查覆盖检测
const nativeCode = /\[native code\]/;
if (!nativeCode.test(navigator.plugins.toString())) {
flagAsStealth();
}
Canvas/WebGL 指纹异常
BaaS 平台运行在没有 GPU 的云基础设施上。它们使用软件渲染,产生与真实 GPU 不同的指纹:
function detectSoftwareRendering() {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
const softwareIndicators = [
'SwiftShader', 'llvmpipe', 'Mesa',
'Software Rasterizer', 'ANGLE'
];
return softwareIndicators.some(i => renderer.includes(i));
}
真实用户拥有真实 GPU,云浏览器则使用软件渲染。
多信号关联
单一信号并不足以定论。将多个弱信号组合成强判定:
class BotDetector {
constructor() {
this.weights = {
tls_mismatch: 40,
software_renderer: 35,
stealth_patches: 30,
behavioral_anomaly: 50,
honeypot_interaction: 100,
mouse_entropy_low: 40
};
}
calculateScore(signals) {
return Object.entries(signals)
.filter(([_, detected]) => detected)
.reduce((sum, [signal]) => sum + (this.weights[signal] || 0), 0);
}
getVerdict(score) {
if (score >= 100) return 'block';
if (score >= 60) return 'challenge';
if (score >= 30) return 'flag';
return 'allow';
}
}
如果不想自行实现,WebDecoy 的 SDK 已经内置了评分、SIEM 集成以及响应自动化。
实施建议
从蜜罐开始
蜜罐提供最高置信度的信号且零误报。请立即部署:
- 隐藏的表单字段,任何输入都会触发
- 隐形链接,用于捕获端点
- CSS 隐藏的内容,仅解析器可见
分层检测方法
| 方法 | 典型效果 |
|---|---|
| 蜜罐 | 零误报,捕获 70‑80 % 的攻击 |
| TLS 指纹识别 | 快速,服务器端 |
| 行为分析 | 捕获高级规避 |
| 多信号关联 | 最高准确率 |
使用渐进式挑战
| 置信级别 | 操作 |
|---|---|
| 低 | 记录并观察 |
| 中 | 限流 |
| 高 | 验证码挑战 |
| 确定(蜜罐) | 阻止 |
武装竞赛仍在继续
Browser‑as‑a‑Service 并不会消失。市场在增长,资金在流入,平台也变得更加复杂。
但根本的不对称性有利于投入行为分析的防御者。BaaS 平台可以伪造技术指纹,但它们无法伪造人类行为。
问题不在于你是否能检测到 BaaS 爬虫,而在于你的现有方案是否针对这种威胁而设计。
Originally published at webdecoy.com
想在不自行构建的情况下捕获 BaaS 爬虫吗? Try WebDecoy — 5 分钟部署。
更多相关内容
- Bot Scanner Pro: Catching Stagehand and Browserbase
- TLS Fingerprinting with WebDecoy SDK
- Headless Browser Detection: Playwright, Puppeteer, Selenium
你对 BaaS 爬虫有什么经验?在下方留言吧。