爬虫扫描行为如何封禁

wen 开源项目 27

本文目录导读:

爬虫扫描行为如何封禁

  1. 第一阶段:基础防御(面向简单/低劣爬虫)
  2. 第二阶段:中级防御(面向中等伪装爬虫)
  3. 第三阶段:高级/智能化防御(面向专业爬虫)
  4. 第四阶段:长效治理(封禁后的处理)
  5. 实施建议(技术栈落地)
  6. 封禁思路优先级

针对爬虫扫描行为的封禁,通常需要结合技术手段策略配置业务逻辑来构建多层次的防御体系,以下是分阶段的封禁方案,涵盖了从基础到高级的策略:

第一阶段:基础防御(面向简单/低劣爬虫)

这类爬虫通常不伪装头部、请求频率过高、或使用固定的User-Agent。

  1. 封禁恶意User-Agent

    • 操作:在Web服务器(Nginx/Apache)或WAF(Web应用防火墙)中,直接拒绝包含 python-requestsGo-http-clientcurlwget 等典型爬虫标识的请求。
    • 注意:合法的搜索引擎爬虫(如Googlebot)需放行,且不能误伤真实用户。
  2. 限制单IP请求频率

    • 操作:在Nginx(配合limit_req模块)、负载均衡或WAF中设置速率限制。
      • 同一个IP每秒最多请求10次。
      • 同一个IP每分钟最多请求200次。
    • 弱点:爬虫易通过代理IP池绕过,对分布式扫描效果有限。
  3. 处理异常的HTTP请求头

    • 操作:检查 Accept-LanguageRefererAccept-Encoding 等字段,爬虫常漏填、乱填(如Accept字段缺失,或User-Agent与操作系统版本矛盾)。
    • 工具:编写规则(如nginx map)或使用WAF自定义规则识别异常特征。

第二阶段:中级防御(面向中等伪装爬虫)

这类爬虫会模仿浏览器头部,但行为模式异常。

  1. 基于行为的实时限流与禁令

    • 操作:统计单IP/单Session在短时间内的访问路径数量,如果10秒内请求了50个不同URL,极可能是扫描。
    • 工具:编写计数器(如使用Redis + 滑动窗口),记录每个IP访问的不同URI数量。
  2. 强制JavaScript挑战(JS Challenge)

    • 原理:服务器返回一段静默的JS代码,要求浏览器执行并计算出一个hash值并返回,真实浏览器可自动执行,而爬虫(尤其基于HTTP库的)无法执行。
    • 工具
      • Nginx的http_javascript_module(很少用)。
      • Cloudflare的“5秒盾”或“Under Attack”模式。
      • 自研中间件(返回包含验证码计算的小型JS)。
  3. Cookie验证与挑战

    • 操作:首次访问时设置一个动态生成的、与IP、时间绑定的Cookie,后续请求必须携带该Cookie且验证通过,爬虫如果不处理Cookie(或处理不当)会立即被拒绝。
    • 注意:需保持Cookie有效期,防止合法用户反复验证。
  4. 图形验证码(CAPTCHA)

    • 触发条件:针对同一IP达到一定访问次数(如30次/分钟)后,弹出验证码。
    • 形式:简单滑块、点选、或简短文字(避免OCR难破解的复杂图,影响用户体验)。

第三阶段:高级/智能化防御(面向专业爬虫)

这类爬虫使用无头浏览器(Puppeteer、Playwright)、真实IP池,甚至模拟用户行为。

  1. 设备指纹与行为分析

    • 操作:收集客户端浏览器指纹(Canvas指纹、WebGL、字体列表、屏幕分辨率、CPU核心数、时区、插件列表)。
    • 对比:同一个指纹在短时间内请求了大量不同页面,或指纹参数异常(如无头浏览器特征)则封禁。
    • 工具:指纹库(如FingerprintJS)、自研特征采集脚本。
  2. 业务逻辑陷阱(蜜罐/Honeypot)

    • 操作:在页面HTML中放入不可见链接隐藏字段
      • <a>标签里放一个style="display:none"的链接;或放入一个隐藏的<input>type="hidden"且无实际作用)。
      • 真实用户不会点击/提交,但爬虫会。
    • 封禁:记录所有识别的IP并永久封禁IP或用户ID。
  3. 路径白名单与黑名单

    • 操作
      • 允许搜索引擎爬虫访问某些路径(如 sitemap.xml)。
      • 对敏感路径(如/admin/api/search?/.env/wp-admin)实施更高的封禁阈值(如2次即可触发封禁)。
    • 实施:在Nginx location 或WAF规则中单独设置限流。
  4. 机器学习/异常检测(可选)

    • 输入:时间序列、浏览器特征、请求路径熵、提交速度。
    • 输出:每个请求的“异常分数”,分数超过阈值则封禁或降权。
    • 工具:ELK Stack(日志)+ ML模型(如LSTM);或SaaS方案(如Cloudflare、Akamai的AI防御)。

第四阶段:长效治理(封禁后的处理)

封禁不是为了惩罚,而是为了保护业务减少成本

  1. 封禁分级

    • 临时封禁:例如IP连续30秒内触发10次限流,封禁10分钟(适用于误拦)。
    • 永久封禁:访问了蜜罐链接、或识别为专业扫描器IP库。
    • 降权/延迟:对于高风险但不确认的IP,人为延迟接口响应(如强制等待3秒),增加攻击成本而不直接拒绝。
  2. IP黑名单管理

    • 来源
      • 公开威胁情报(类似AbuseIPDB)。
      • 自身日志中统计出的TOP攻击IP段。
    • 操作:定期导入到防火墙或WAF的黑名单组。
  3. 日志与告警

    • 记录:被封禁的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指纹检查)

封禁思路优先级

  1. 拦截“低质量流量”:限速、User-Agent黑名单。
  2. 消耗“中等流量”:JS验证、Cookie验证、蜜罐。
  3. 隔离“高质量模拟”:设备指纹 + 行为分析 + 限频。
  4. 长效治理:黑名单共享、IP段进入防火墙、升级密码学验证。

最后需要注意:封禁的核心不是“杀无赦”,而是“区分用户与爬虫”,误伤正常用户(如VPN用户、代理用户、CDN节点)会导致投诉和业务损失,因此建议先观察、后逐步收紧,并辅以用户申诉渠道(如解封URL)。

抱歉,评论功能暂时关闭!