本文目录导读:

针对爬虫扫描行为的封禁,通常需要结合技术手段、策略配置和业务逻辑来构建多层次的防御体系,以下是分阶段的封禁方案,涵盖了从基础到高级的策略:
第一阶段:基础防御(面向简单/低劣爬虫)
这类爬虫通常不伪装头部、请求频率过高、或使用固定的User-Agent。
-
封禁恶意User-Agent
- 操作:在Web服务器(Nginx/Apache)或WAF(Web应用防火墙)中,直接拒绝包含
python-requests、Go-http-client、curl、wget等典型爬虫标识的请求。 - 注意:合法的搜索引擎爬虫(如Googlebot)需放行,且不能误伤真实用户。
- 操作:在Web服务器(Nginx/Apache)或WAF(Web应用防火墙)中,直接拒绝包含
-
限制单IP请求频率
- 操作:在Nginx(配合
limit_req模块)、负载均衡或WAF中设置速率限制。- 同一个IP每秒最多请求10次。
- 同一个IP每分钟最多请求200次。
- 弱点:爬虫易通过代理IP池绕过,对分布式扫描效果有限。
- 操作:在Nginx(配合
-
处理异常的HTTP请求头
- 操作:检查
Accept-Language、Referer、Accept-Encoding等字段,爬虫常漏填、乱填(如Accept字段缺失,或User-Agent与操作系统版本矛盾)。 - 工具:编写规则(如nginx map)或使用WAF自定义规则识别异常特征。
- 操作:检查
第二阶段:中级防御(面向中等伪装爬虫)
这类爬虫会模仿浏览器头部,但行为模式异常。
-
基于行为的实时限流与禁令
- 操作:统计单IP/单Session在短时间内的访问路径数量,如果10秒内请求了50个不同URL,极可能是扫描。
- 工具:编写计数器(如使用
Redis+ 滑动窗口),记录每个IP访问的不同URI数量。
-
强制JavaScript挑战(JS Challenge)
- 原理:服务器返回一段静默的JS代码,要求浏览器执行并计算出一个hash值并返回,真实浏览器可自动执行,而爬虫(尤其基于HTTP库的)无法执行。
- 工具:
- Nginx的
http_javascript_module(很少用)。 - Cloudflare的“5秒盾”或“Under Attack”模式。
- 自研中间件(返回包含验证码计算的小型JS)。
- Nginx的
-
Cookie验证与挑战
- 操作:首次访问时设置一个动态生成的、与IP、时间绑定的Cookie,后续请求必须携带该Cookie且验证通过,爬虫如果不处理Cookie(或处理不当)会立即被拒绝。
- 注意:需保持Cookie有效期,防止合法用户反复验证。
-
图形验证码(CAPTCHA)
- 触发条件:针对同一IP达到一定访问次数(如30次/分钟)后,弹出验证码。
- 形式:简单滑块、点选、或简短文字(避免OCR难破解的复杂图,影响用户体验)。
第三阶段:高级/智能化防御(面向专业爬虫)
这类爬虫使用无头浏览器(Puppeteer、Playwright)、真实IP池,甚至模拟用户行为。
-
设备指纹与行为分析
- 操作:收集客户端浏览器指纹(Canvas指纹、WebGL、字体列表、屏幕分辨率、CPU核心数、时区、插件列表)。
- 对比:同一个指纹在短时间内请求了大量不同页面,或指纹参数异常(如无头浏览器特征)则封禁。
- 工具:指纹库(如FingerprintJS)、自研特征采集脚本。
-
业务逻辑陷阱(蜜罐/Honeypot)
- 操作:在页面HTML中放入不可见链接或隐藏字段。
- 在
<a>标签里放一个style="display:none"的链接;或放入一个隐藏的<input>(type="hidden"且无实际作用)。 - 真实用户不会点击/提交,但爬虫会。
- 在
- 封禁:记录所有识别的IP并永久封禁IP或用户ID。
- 操作:在页面HTML中放入不可见链接或隐藏字段。
-
路径白名单与黑名单
- 操作:
- 允许搜索引擎爬虫访问某些路径(如
sitemap.xml)。 - 对敏感路径(如
/admin、/api/search?、/.env、/wp-admin)实施更高的封禁阈值(如2次即可触发封禁)。
- 允许搜索引擎爬虫访问某些路径(如
- 实施:在Nginx
location或WAF规则中单独设置限流。
- 操作:
-
机器学习/异常检测(可选)
- 输入:时间序列、浏览器特征、请求路径熵、提交速度。
- 输出:每个请求的“异常分数”,分数超过阈值则封禁或降权。
- 工具:ELK Stack(日志)+ ML模型(如LSTM);或SaaS方案(如Cloudflare、Akamai的AI防御)。
第四阶段:长效治理(封禁后的处理)
封禁不是为了惩罚,而是为了保护业务和减少成本。
-
封禁分级
- 临时封禁:例如IP连续30秒内触发10次限流,封禁10分钟(适用于误拦)。
- 永久封禁:访问了蜜罐链接、或识别为专业扫描器IP库。
- 降权/延迟:对于高风险但不确认的IP,人为延迟接口响应(如强制等待3秒),增加攻击成本而不直接拒绝。
-
IP黑名单管理
- 来源:
- 公开威胁情报(类似AbuseIPDB)。
- 自身日志中统计出的TOP攻击IP段。
- 操作:定期导入到防火墙或WAF的黑名单组。
- 来源:
-
日志与告警
- 记录:被封禁的IP、封禁原因、访问的目标URL、User-Agent。
- 通知:当连续发现大量IP(如同一C段、同一ASN下的IP)时,发送告警给运维/安全团队。
实施建议(技术栈落地)
| 技术水平 | 推荐方案 | 工具/平台 |
|---|---|---|
| 团队小、突发防护 | 使用CDN/WAF的一键开启“机器人管理”或“恶意IP封禁” | Cloudflare、阿里云WAF、腾讯云WAF、AWS WAF |
| 有一定开发能力 | Nginx + Lua (OpenResty) 实现定制化JS挑战、HMAC签名 | OpenResty、Nginx + lua-nginx-module |
| 大型业务、自建基础设施 | 基于数据流(如Kafka)的实时分析 + 规则引擎 + 模型 | Flink + Redis + ELK、自研指纹库、Splunk |
| 极端敏感(如金融) | 需要双向SSL/TLS指纹验证(部分金融接口会验证客户端证书) | 或有CDN的TLS指纹能力(如JA3指纹检查) |
封禁思路优先级
- 拦截“低质量流量”:限速、User-Agent黑名单。
- 消耗“中等流量”:JS验证、Cookie验证、蜜罐。
- 隔离“高质量模拟”:设备指纹 + 行为分析 + 限频。
- 长效治理:黑名单共享、IP段进入防火墙、升级密码学验证。
最后需要注意:封禁的核心不是“杀无赦”,而是“区分用户与爬虫”,误伤正常用户(如VPN用户、代理用户、CDN节点)会导致投诉和业务损失,因此建议先观察、后逐步收紧,并辅以用户申诉渠道(如解封URL)。