Skip to content

User-Agent 过滤器 🛡️

功能概述 📝

User-Agent 过滤器用于控制客户端访问权限,通过校验 HTTP 请求头中的 User-Agent 信息来提升系统安全性。

功能特性 ✨

过滤模式

  • 🔍 规则匹配:支持正则表达式匹配 User-Agent
  • 🚫 空值处理:可配置是否允许空 User-Agent
  • 🎯 URL 匹配:支持针对特定 URL 路径配置规则
  • 🔄 动态配置:支持运行时动态修改规则

应用场景

  • ✓ 爬虫访问控制
  • ✓ 特定客户端限制
  • ✓ 移动端访问控制
  • ✓ API 接口保护

配置说明 ⚙️

基础配置参数

参数名类型必填默认值说明
enabledbooleanfalse是否启用过滤器
rulesarray[object]-过滤规则列表

规则配置项 (rules)

参数名类型必填默认值说明
urlsarray[string]-需要过滤的URL路径列表
emptybooleanfalse是否允许空User-Agent
datasarray[string][爬虫检测规则]User-Agent匹配规则列表(正则表达式)

默认爬虫检测规则

如果未配置datas,系统会使用默认的爬虫检测规则来拦截常见的爬虫、自动化工具和恶意请求:

regex
(?i).*(bot|spider|crawl|slurp|wget|curl|fetch|python|scrapy|phantom|selenium|headless|puppeteer|jsdom|axios|request|http-client|webdriver|chromedriver|geckodriver).*

此规则会拦截以下类型的请求:

  • 搜索引擎爬虫 (bot, spider, crawl, slurp)
  • 下载工具 (wget, curl, fetch)
  • 爬虫框架 (python, scrapy)
  • 自动化测试工具 (phantom, selenium, puppeteer)
  • 无头浏览器 (headless)
  • HTTP客户端库 (axios, request, http-client)
  • 浏览器驱动 (webdriver, chromedriver, geckodriver)

配置示例 📝

基础配置(使用默认爬虫检测)

yaml
gateway:
  filter:
    user-agent:
      enabled: true  # 启用过滤器
      rules:
        - urls:
            - /api/**  # 匹配所有API路径
          empty: false  # 不允许空User-Agent
          # 不配置datas,将使用默认爬虫检测规则

自定义规则配置

yaml
gateway:
  filter:
    user-agent:
      enabled: true
      rules:
        # 公开API使用默认爬虫检测
        - urls:
            - /api/public/**
          empty: false
        
        # 管理API使用自定义规则
        - urls:
            - /api/admin/**
          empty: false
          datas:  # 覆盖默认规则,仅允许特定浏览器
            - "^Mozilla/5\\.0 .*Chrome/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Firefox/\\d+\\.\\d+.*"
        
        # 测试API允许特定爬虫工具
        - urls:
            - /api/test/**
          empty: true
          datas:
            - "^PostmanRuntime.*"
            - "^Apache-HttpClient.*"
            - "^curl/.*"

复杂场景配置

yaml
gateway:
  filter:
    user-agent:
      enabled: true
      rules:
        # 移动端API规则
        - urls:
            - /api/mobile/**
          empty: false
          datas:
            - "^Mozilla/5\\.0 \\(iPhone.*"
            - "^Mozilla/5\\.0 \\(iPad.*"
            - "^Mozilla/5\\.0 \\(Linux; Android.*"
        
        # 后台管理API规则
        - urls:
            - /api/admin/**
          empty: false
          datas:
            - "^Mozilla/5\\.0 .*Chrome/\\d+\\.\\d+.*"  # 仅允许Chrome浏览器
            - "^Mozilla/5\\.0 .*Firefox/\\d+\\.\\d+.*"  # 仅允许Firefox浏览器
        
        # 开发测试API规则
        - urls:
            - /api/test/**
          empty: true
          datas:
            - "^PostmanRuntime.*"
            - "^curl/.*"
            - "^Apache-HttpClient.*"

完整配置示例

yaml
gateway:
  filter:
    user-agent:
      enabled: true
      rules:
        # 严格模式 - 仅允许主流浏览器
        - urls:
            - /api/secure/**
            - /api/payment/**
          empty: false
          datas:
            - "^Mozilla/5\\.0 .*Chrome/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Firefox/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Safari/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Edge/\\d+\\.\\d+.*"
        
        # 移动端应用
        - urls:
            - /api/app/**
          empty: false
          datas:
            - "^MyApp/\\d+\\.\\d+.*"  # 自定义应用标识
            - "^Mozilla/5\\.0 \\(iPhone.*"
            - "^Mozilla/5\\.0 \\(iPad.*"
            - "^Mozilla/5\\.0 \\(Linux; Android.*"
        
        # 开发调试接口
        - urls:
            - /api/debug/**
          empty: true
          datas:
            - "^PostmanRuntime.*"
            - "^curl/.*"
            - "^Apache-HttpClient.*"
            - "^Java/.*"
            - "^Go-http-client.*"
        
        # 公开API - 使用默认爬虫检测
        - urls:
            - /api/public/**
          empty: false

不同业务场景配置

电商平台

yaml
gateway:
  filter:
    user-agent:
      enabled: true
      rules:
        # 用户端API - 仅允许浏览器和移动应用
        - urls:
            - /api/user/**
            - /api/order/**
          empty: false
          datas:
            - "^Mozilla/5\\.0.*"  # 所有浏览器
            - "^MyShopApp/\\d+\\.\\d+.*"  # 自定义移动应用
        
        # 商家后台 - 仅允许桌面浏览器
        - urls:
            - /api/merchant/**
          empty: false
          datas:
            - "^Mozilla/5\\.0 .*Chrome/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Firefox/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Safari/\\d+\\.\\d+.*"
        
        # 开放API - 允许合法的第三方调用
        - urls:
            - /api/open/**
          empty: false
          datas:
            - "^ThirdPartyApp/\\d+\\.\\d+.*"
            - "^PostmanRuntime.*"

内容管理系统

yaml
gateway:
  filter:
    user-agent:
      enabled: true
      rules:
        # 内容发布接口 - 严格限制
        - urls:
            - /api/content/**
            - /api/publish/**
          empty: false
          datas:
            - "^Mozilla/5\\.0 .*Chrome/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Firefox/\\d+\\.\\d+.*"
        
        # 文件上传接口 - 允许编辑器
        - urls:
            - /api/upload/**
          empty: false
          datas:
            - "^Mozilla/5\\.0.*"
            - "^TinyMCE.*"
            - "^CKEditor.*"
        
        # 公开内容API - 默认爬虫检测
        - urls:
            - /api/article/**
          empty: false

金融系统

yaml
gateway:
  filter:
    user-agent:
      enabled: true
      rules:
        # 交易接口 - 最严格限制
        - urls:
            - /api/trade/**
            - /api/transfer/**
          empty: false
          datas:
            - "^Mozilla/5\\.0 .*Chrome/\\d+\\.\\d+.*"
            - "^Mozilla/5\\.0 .*Firefox/\\d+\\.\\d+.*"
            - "^FinanceApp/\\d+\\.\\d+.*"  # 官方金融应用
        
        # 查询接口 - 允许移动端
        - urls:
            - /api/account/**
            - /api/balance/**
          empty: false
          datas:
            - "^Mozilla/5\\.0.*"
            - "^FinanceApp/\\d+\\.\\d+.*"
        
        # 第三方接口 - 白名单模式
        - urls:
            - /api/partner/**
          empty: false
          datas:
            - "^PartnerSystem/\\d+\\.\\d+.*"
            - "^TrustedThirdParty/\\d+\\.\\d+.*"

正则表达式示例 🎯

常用浏览器匹配

regex
# Chrome浏览器
^Mozilla/5\.0 \(.*\) AppleWebKit/.* Chrome/.*

# Firefox浏览器
^Mozilla/5\.0 \(.*\) Gecko/.* Firefox/.*

# Safari浏览器
^Mozilla/5\.0 \(.*\) AppleWebKit/.* Safari/.*

移动端匹配

regex
# iOS设备
^Mozilla/5\.0 \(iPhone|iPad|iPod\).*

# Android设备
^Mozilla/5\.0 \(Linux; Android.*

自定义应用匹配

regex
# 自定义移动应用
^MyApp/\d+\.\d+.*

# 第三方系统
^PartnerSystem/\d+\.\d+.*

⚠️ 注意事项

  1. 规则优先级

    • 规则按配置顺序从上到下匹配
    • URL匹配成功后,会验证User-Agent是否匹配datas中的任意一个规则
    • 如果未配置datas,将使用默认爬虫检测规则
    • 建议将更具体的规则放在前面
  2. 性能考虑

    • 默认爬虫检测规则已经过优化,性能影响较小
    • 自定义规则时避免过于复杂的正则表达式
    • 合理配置规则数量
    • 建议每个URL路径的datas数量不超过10个
  3. 安全建议

    • 对于公开API建议使用默认爬虫检测规则
    • 对于管理API建议使用更严格的自定义规则
    • 记录被拦截的异常访问日志
    • 定期更新规则列表适应新的爬虫特征

重要提示

  • 正则表达式需要严格测试
  • 建议配合其他安全措施使用
  • 关注性能影响