如何在2025年检测 Browser-as-a-Service Scrapers

发布: (2025年12月17日 GMT+8 03:41)
9 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容,我将按照您的要求将其翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!

浏览器即服务的崛起

BaaS 平台到底做什么

浏览器即服务平台提供云托管的浏览器基础设施,以实现大规模自动化。不同于发送原始 HTTP 请求的传统爬虫工具,BaaS 平台运行真实的 Chromium 浏览器,能够:

  • 执行 JavaScript
  • 渲染页面
  • 像合法用户一样保持会话

2025 年主要玩家

平台融资 / 状态关键特性
Browserbase$67.5 M 总融资(市场领袖)托管的无头浏览器、会话持久化、代理支持、用于 AI 代理的 Stagehand SDK。被 Perplexity、Vercel、11x 使用。
SkyvernY 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_count1478
linear_path_ratio0.12(大多为曲线)0.91(直线)
velocity_variance0.84(高度可变)0.08(恒定)
overshoots40

即使使用 “类人” 随机化,统计分析仍能揭示合成模式。

点击时序分布

人类的反应时间呈右偏分布(≈ 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 分钟部署。

更多相关内容

你对 BaaS 爬虫有什么经验?在下方留言吧。

Back to Blog

相关文章

阅读更多 »