← 返回信息流
AI 资讯Hacker News·1 小时前

开源隐身浏览器宣称击败Cloudflare机器人检测

原标题:Show HN: We beat Cloudflare's bot detection (open-source stealth browser)

速览

该项目在Hacker News上展示,声称通过模拟真实用户行为破解了Cloudflare的bot检测。它作为一个开源隐身浏览器,可帮助用户或开发者绕过反爬机制,用于网页抓取等合法用途。此举引发了对网络防护与隐私工具的讨论,同时也存在被滥用于恶意活动的风险。

AI 深度解读

背景

2025年7月1日起,Cloudflare 默认在所有新域名上拦截 AI 爬虫,至今已拦截数千亿次机器人请求。这场「AI 实验室 vs 内容出版商」的对抗吸引了大量关注,但对开发者而言,更棘手的问题往往藏在细节里:AI agent 在抓取受保护页面时,不会因为被拦截而报错,反而会安静地读取 Cloudflare 的「Just a moment」验证页面,然后用同样自信的语气把错误信息当成真实内容返回。这种「自信的错误」比显性失败更危险,因为它没有任何失败信号,agent 和开发者都难以察觉。

核心内容

作者发现,当 agent 通过 fetch()httpx.get()requests.get() 向受机器人保护的网站发起请求时,通常不会触发异常。服务器返回的是 403(有时甚至是 200)状态码,但 body 里是一整段 HTML——Cloudflare 的「Just a moment」验证页、DataDome 的「please enable JavaScript」、PerimeterX 的「Press & Hold」、Amazon 的「Continue shopping」墙等。对于重试逻辑而言,请求完成即算成功;对于语言模型而言,body 只是需要阅读的文本。把 27KB 的拦截页面交给模型并让它提取职位信息,它会像模像样地列出一串实际上不存在的职位。正确的答案和错误的答案无法区分。相反,一次显性失败(如超时或返回空 body 的 429)会触发重试或跳过,但这种安静的拦截页面因为看起来像内容而顺利通过。

作者在 2025 年 7 月 10 日对一组热门网站发送普通浏览器请求,发现 12 个最常见的目标返回了硬 403:包括 Indeed、Zillow、G2、Etsy、StockX、Walmart 等。如果你的 agent 在做招聘、销售研究、线索生成或购物相关任务,你很可能会遇到这种情况,而且很可能不会注意到——agent 会从它从未真正读过的页面中构建出看似正常的答案。

为了量化问题,作者设计了基准测试:选取 8 个网站,每个对应一家主流反机器人供应商(Cloudflare、CloudFront、PerimeterX、DataDome、Amazon 等),分别用三种方式发起请求。Naive 方式(使用普通桌面 Chrome UA 的 curl)8 次中从未获得真实内容,8 次中每次都获得可被总结的 body,8 次中从未获得 agent 可用于判断被拦截的信号。开源的 Fortress 隐身浏览器能够通过其中 5 个:Cloudflare、CloudFront、PerimeterX 的防护,从 Indeed、Zillow、StockX 返回干净的、结构化的数据。DataDome(对应 Etsy、G2)和 Amazon 的点击墙是 Fortress 目前无法突破的 3 个目标,而 Tilion Cloud(Fortress 之上的托管层)正是为解决这些目标而构建。

通过并排对比能看到明显差异:对 indeed.com/jobs?q=software+engineer,naive 获取返回 27KB 的「Just a moment...」,而 Fortress 返回实际的职位列表(Senior Software Developer、Principal Backend Engineer 等,含薪资和描述);对 zillow.com/homes/for_sale/San-Francisco,naive 获取返回 403 拒绝页面,Fortress 返回 878 条活跃房源(含价格、卧室数、浴卫数、面积、中介信息)。naive 路径上的 agent 在两种情况下都不报错,安静地概括拦截页面然后继续。

作者指出,通过防护是一道「梯子」,不存在单一技巧。面对 Cloudflare、CloudFront、PerimeterX,一次耐心等待 JS challenge 完成的隐身抓取就够了(覆盖 Indeed、Zillow、Walmart)。将完整页面渲染为结构化 markdown 可以捕获 SPA 和 JS 锁定的内容。当真实数据在后台传输时,通过侦察驱动页面并监听私有 API 流量——在 StockX 上,这解决了 Cloudflare challenge 并捕获了返回 200 的 POST /api/graphql(即网站自己的定价后端),这比解析 HTML 更好,因为能得到真实 JSON。

DataDome 和点击墙是开源版无法触及的层级。DataDome 在应用启动前就关上了门,因此没有任何 XHR 发出,也读不到任何内容。Amazon 则将产品隐藏在点击之后。这是花费时间最长的部分,也是 Tilion Cloud 发挥作用的地方。Tilion Cloud 维护保活的、持久的浏览器配置文件,匹配真实桌面 Chrome 的指纹和 TLS,并内联处理插页广告,这正是 DataDome 和 Amazon 点击墙所寻找的。在同样的 8 个站点上,它全部通过,包括 Etsy 和 G2。

Fortress 本身保持开源,上述「5/8」结果可直接在公开构建中复现。修复的关键在于:通过很重要,但察觉是否通过更重要。在 agent 嵌入页面、引用来源或比较价格之前,需要一次简单的检查:这是真实页面还是拦截屏幕?拦截页面有固定的签名(Cloudflare 的「Just a moment」、DataDome 的「enable JavaScript」、PerimeterX 的「Press & Hold」、Amazon 的「Continue shopping」)。Fortress 在无法通过时会返回 blocked: truetext: "",这样 agent 就知道停止,而不是总结挑战页面。

集成方式:通过 Fortress MCP 接入。安装命令 pip install "tilion[mcp]"(自动拉取 Fortress 引擎),然后运行 tilion-mcp 作为 stdio 传输。在 Claude Desktop、Cursor、Cline 或 Windsurf 的 MCP 配置中添加服务器即可。Fortress 开源且可免费本地运行。Tilion Cloud(用于 DataDome 层)目前处于等待列表状态。

关键要点

  • 安静失败比硬错误更危险:当 agent 收到 403(甚至 200)但 body 包含验证页面时,重试逻辑认为成功,语言模型将其作为内容处理,产生自信的错误答案,且无任何错误信号输出。
  • Naive fetch 在 8 个反机器人防护中全部失败:0/8 获得真实内容,8/8 获得可总结的 body,0/8 获得可用于判断被拦截的信号。
  • Fortress 开源版能通过 5/8:突破 Cloudflare、CloudFront、PerimeterX 的防护,从 Indeed、Zillow、StockX 返回结构化数据。
  • Tilion Cloud 托管层能通过全部 8 个:通过维护保活浏览器配置文件、匹配真实指纹与 TLS、内联处理插页后的 DataDome 和 Amazon 点击墙。
  • 通过防护是分层递进的:从静态 JS challenge(Cloudflare/CloudFront/PerimeterX)、到页面渲染(SPA/JS 内容)、再到监听私有 API(StockX 的 GraphQL),每个层级需要不同的策略。
  • DataDome 和点击墙是最高层级:DataDome 在应用启动前关闭服务,Amazon 隐藏产品在点击后,均需要更复杂的方案。
  • 开源 Fortress 返回明确拦截标志blocked: true 配合空文本,使 agent 能停止并避免错误回答,这是解决问题的最关键改进。
  • 集成简单:通过 MCP 协议(pip install tilion[mcp] 后运行 tilion-mcp)即可在 Claude Desktop、Cursor、Cline、Windsurf 等工具中直接使用。

意义与影响

这一发现揭示了一个普遍但被忽视的问题:现代 AI agent 在处理被防护的网页时,缺乏可靠的失败检测机制。传统的 HTTP 状态码不再足够,因为许多反机器人系统返回的是「伪成功」响应——完整的 HTML 内容(虽然只是验证页面)。语言模型天生的「文本即内容」特性使这一问题放大,导致 agent 在不知情的情况下产出错误信息。

Fortress 的开源方案提供了一种透明、可复现的解决方案:不仅通过指纹伪装和浏览器行为模拟来突破防护,更关键的是在无法通过时显式报告失败(返回 blocked: true),从而切断错误传播链。这对构建可靠的 AI agent

查看原文 →tilion.dev