这篇文章主要是关于反向工程 Vercel 的 BotID,包括其基本模式和深度分析模式。
基本模式:
可添加到现有 Next.js 项目中,通过
yarn add botid
安装,保护路由的代码示例如下:import { checkBotId } from 'botid/server'; import { NextRequest, NextResponse } from 'next/server'; export async function POST(request: NextRequest) { const verification = await checkBotId(); if (verification.isBot) { return NextResponse.json({ error: 'Access denied' }, { status: 403 }); } const data = await processUserRequest(); return NextResponse.json({ data }); }
- 页面中创建简单表单调用该 API,根据返回结果判断是否为机器人。
- 发现浏览器访问时会获取新脚本
c.js
,其中包含混淆的 JavaScript 代码。通过Babel
可将字符串解码函数的调用表达式替换为清晰的函数名,以方便静态分析。 - 脚本的字符串解码过程分为三步:定义编码字符串常量、打乱字符串常量、定义解码函数。此脚本使用了
javascript-obfuscator
进行混淆,可使用ben-sb
的去混淆工具或自行编写去混淆工具。 - 自行编写的去混淆工具通过
@babel/traverse
找到编码字符串常量、打乱函数和解码函数,将这些函数放入一个独立的脚本中运行,并通过vm
模块在其自己的执行环境中执行。还添加了常量折叠和表达式求值的 passes 来清理和简化脚本。
浏览器信号有效负载:
- 通过多个函数检测浏览器中的各种信号,如检测
window
和navigator
中的泄漏、检测User Agent
中的“headless”、收集浏览器的 GPU 渲染器和供应商信息、检测 Chrome Devtools Protocol (CDP)等。 - 这些检测的结果存储在一个对象中,并传递给加密函数,Next.js 会将加密结果作为
x-is-human
头传递给受保护的路由。
绕过检查的方法:
- 可以通过伪造收集信号之前的值来绕过基本模式的检查,如修改
navigator
属性、User Agent
、WebGL
渲染器信息等。
深度分析模式:
- Vercel 推荐使用深度分析模式,该模式使用Kasada的反机器人技术收集更多信号,并与现有训练模型进行比较以检测类似机器人的请求。
- 启用此模式需要
Pro
($20/mo)或Enterprise
计划,并且每 1000 个请求额外收费$1。 - 深度分析使用 Kasada 的反机器人脚本,类似于 Nike 网站上部署的脚本,需要反汇编嵌入式字节码才能了解发送到其服务器进行分析的内容。
结论:
- Vercel 的 BotID(基本模式)目前似乎未配置为实际阻止机器人,可能只是用于在更严格的检测启动之前收集信号。深度分析模式则使用 Kasada 的指纹脚本和分类器来主动阻止更高级的机器人。
- 两种模式都依赖于指纹识别和客户端数据收集,反机器人技术越来越不透明、数据饥渴,并倾向于对“正常”用户进行狭隘的定义。这些脚本有其实际目的,但构建方式继续以难以忽视和挑战的方式塑造着网络。
脚注提供了相关链接,用于进一步了解文中提到的一些概念和技术。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。