如何识别正常用户、恶意爬虫和自动化 Bot?
Bot 不等于坏人。本文把流量判据拆成凭据、环境、行为三层,给出可落地的判定顺序与分级处置矩阵,以及为什么「加白名单」比「调低阈值」更正确。
先纠正一个误区:Bot 不等于坏人
| 类型 | 典型例子 | 应该拦吗 |
|---|---|---|
| 搜索引擎爬虫 | 主流搜索引擎、收录型 AI 抓取器 | 不该,但要验证身份后放行 |
| 商业 API 调用方 | 合作伙伴、客户系统集成 | 不该,走独立令牌与配额 |
| 可用性与监控 | 拨测、健康检查 | 不该,加白名单 |
| 恶意爬虫与采集 | 剧集/商品/内容批量抓取 | 应该 |
| 滥用脚本 | 刷量、薅额度、撞库、刷票 | 应该 |
把「自动化」当成恶意会误伤搜索引擎与合作伙伴;把「自动化」当成无害会让账单和版权一起失控。真正的任务不是分辨人还是机器,而是分辨「已授权的自动化」和「未授权的自动化」。
判据的三层结构
凭据层:你说你是谁。 签名令牌、mTLS 证书、API Key、OAuth 声明。这一层最强,也最容易被工程团队忽略——因为大多数系统的凭据只用于鉴权,不参与风控判定。
环境层:你从什么环境来的。 TLS 指纹(握手参数组合)、HTTP/2 帧序、浏览器环境完整性、是否执行了 JS 挑战。脚本直接发请求时,这些特征与真实浏览器不同,几乎无法靠改 UA 掩盖。Cloudflare Bot Management 在边缘采集这类信号并结合全局流量训练的模型给出 Bot Score(1–99 的自动化置信度)。
行为层:你在做什么。 请求节奏是否机械均匀、是否只访问生成类端点、会话是否只有开始没有心跳、端点访问序列是否符合真实播放或浏览路径。行为层最难伪造,但需要足够长的观察窗口。
三层判据的可靠性对比
| 判据层 | 伪造难度 | 典型绕过方式 | 建议权重 |
|---|---|---|---|
| 凭据层 | 高(需要真凭据) | 凭据泄露、共享 | 高,但只适用于已接入鉴权的接口 |
| 环境层 | 高(需改协议栈) | 无头内核、真实浏览器驱动 | 高,作为主要打分依据 |
| 行为层 | 最高(需模拟真人) | 慢速分布式、真人打码 | 中高,需要观察窗口 |
| 来源层(IP/UA) | 低 | 代理池、UA 伪造 | 低,只作辅助信号 |
来源层(IP、User-Agent、Referer)几乎是所有团队最先想到、也最不可靠的一层:UA 一行就能改,Referer 由客户端控制,而家庭宽带与移动网络是共享出口。把 IP 当主判据,必然同时产生高误杀和高漏过。
一个可落地的判定顺序
1. 先放行已验证的好 Bot。 主流搜索引擎有可验证的反向 DNS 与公开的抓取声明,验证后加入允许列表;合作伙伴与健康检查走独立令牌或固定出口 IP。这一步的意义是把噪声从判定样本里剔除,后面的阈值才能收紧。
2. 凭据校验。 有令牌就验令牌,没有令牌的请求直接进入下一层判定,而不是直接拒绝。
3. 环境指纹打分。 用边缘采集的信号输出自动化置信度。这一步是主力,但它给出的是概率,不是结论。
4. 行为分析补位。 对中分区域的请求延长观察:请求节奏、端点组合、会话完整性。让可疑流量自己暴露。
5. 分级处置,而不是二选一。
分级处置矩阵
| 判定区间 | 处置方式 | 说明 |
|---|---|---|
| 已验证好 Bot | 放行 + 单独计量 | 仍要记录消耗,避免合作方失控 |
| 低可疑 | 放行 + 记录 | 保留样本用于回看 |
| 中可疑 | 无感挑战 / 降级 / 排队 | 优先用无感验证,不打断正常用户 |
| 高可疑 | 显式挑战 | 确认是真人后放行并短期记住结果 |
| 明确恶意 | 拒绝 / 限速 / 拉黑 | 只针对持续且可归因的来源封禁 |
中分区间是收益最大的地方:直接拒绝会误杀,直接放行会漏过,用「无感挑战或降级」处理,两个错误都不犯。
边界与不适用情况
- 依赖长尾爬虫的 SEO不要一刀切拦截未知 UA,先按行为与消耗分级;误杀新抓取器等于放弃新渠道的收录。
- 已授权但超量的合作方属于配额问题而不是 Bot 问题,用配额与告警处理,不要靠挑战解决。
- 隐私合规限制了指纹采集范围时,应提高凭据层与行为层的权重,而不是完全依赖环境指纹。
FAQ
Bot Score 该按多少分拦截? 不要全局定一个死阈值。先按端点分组看分数分布:登录、领额度、生成类接口各自定阈值,因为不同接口的误杀代价完全不同。
误伤了搜索引擎爬虫怎么办? 把它们加入允许列表而不是调低整体阈值。后者等于为了放行爬虫而把恶意流量也放进来,是典型的本末倒置。
为什么加了 JS 挑战还是被刷? 因为高级自动化会用真实浏览器内核执行 JS。JS 挑战挡的是脚本直连,不是无头浏览器;这一层要和环境指纹、行为分析叠加才有意义。
无头浏览器能完全识别吗? 不能。识别的目标是抬高攻击者的工程成本,让它规模化不划算。接受「有少量漏过」,把精力放在限额、降级和成本熔断上,比追求完美识别更实际。