Files
tyapi-server/docs/每日请求限制中间件使用指南.md
2025-08-10 14:40:02 +08:00

5.5 KiB
Raw Blame History

每日请求限制中间件使用指南

概述

每日请求限制中间件DailyRateLimitMiddleware是一个专门用于防护恶意请求的高级安全中间件。它不仅限制每个IP地址的每日请求次数还集成了多种安全防护措施确保API接口不被恶意攻击者滥用保护系统资源和成本。

核心特性

1. 基础限流功能

  • 每日限制每个IP地址每日最多请求10次
  • 并发控制每个IP同时最多5个并发请求
  • Redis存储使用Redis确保分布式环境中的计数一致性
  • 自动过期计数器自动在24小时后过期

2. 高级安全防护

  • IP白名单/黑名单精确控制IP访问权限
  • User-Agent检测:阻止机器人、爬虫、脚本工具等恶意请求
  • Referer验证:确保请求来源合法
  • 代理检测识别并处理代理IP
  • 地理位置阻止:阻止特定国家/地区的访问

3. 隐蔽性设计

  • 隐藏限制信息:客户端无法获知被限制的真实原因
  • 通用错误响应:返回"系统繁忙"等通用错误信息
  • 内部监控头:仅用于系统内部监控,客户端不可见

配置说明

基础配置

daily_ratelimit:
    max_requests_per_day: 10      # 每日最大请求次数
    max_requests_per_ip: 10       # 每个IP每日最大请求次数
    key_prefix: "daily_limit"     # Redis键前缀
    ttl: 24h                      # 键过期时间
    max_concurrent: 5             # 最大并发请求数

安全配置

daily_ratelimit:
    # IP访问控制
    enable_ip_whitelist: false    # 是否启用IP白名单
    ip_whitelist:                 # IP白名单列表
        - "192.168.1.*"           # 内网IP段
        - "10.0.0.*"              # 内网IP段
    
    enable_ip_blacklist: true     # 是否启用IP黑名单
    ip_blacklist:                 # IP黑名单列表
        - "0.0.0.0"               # 无效IP
        - "255.255.255.255"       # 广播IP
    
    # User-Agent检测
    enable_user_agent: true       # 是否检查User-Agent
    blocked_user_agents:          # 被阻止的User-Agent
        - "bot"                   # 机器人
        - "crawler"               # 爬虫
        - "curl"                  # curl工具
        - "python"                # Python脚本
    
    # Referer验证
    enable_referer: true          # 是否检查Referer
    allowed_referers:             # 允许的Referer
        - "yourdomain.com"        # 你的域名
    
    # 代理检测
    enable_proxy_check: true      # 是否检查代理

防护恶意请求的措施

1. 机器人检测

  • 自动识别并阻止常见的爬虫工具
  • 阻止无User-Agent的请求
  • 阻止自动化测试工具

2. IP地址控制

  • 黑名单阻止已知的恶意IP
  • 白名单仅允许受信任的IP访问
  • 支持通配符匹配如192.168.1.*

3. 请求来源验证

  • 验证Referer头部确保请求来源合法
  • 阻止来自未知域名的请求
  • 防止跨站请求伪造CSRF

4. 并发控制

  • 限制单个IP的并发请求数
  • 防止DDoS攻击
  • 保护系统资源

5. 代理检测

  • 识别各种代理头部
  • 获取真实客户端IP
  • 防止IP伪造攻击

使用示例

应用到特定路由

// 在认证路由中应用
authGroup.POST("/enterprise-info", r.dailyRateLimit.Handle(), r.handler.SubmitEnterpriseInfo)

配置检查

// 检查中间件状态
stats := dailyRateLimit.GetStats()
log.Printf("中间件配置: %+v", stats)

响应处理

正常响应

  • 请求通过所有检查后正常处理
  • 在隐藏的响应头中添加监控信息

被阻止的请求

  • 返回通用错误信息:"访问被拒绝"或"系统繁忙"
  • 不暴露具体的限制原因
  • 记录详细的日志用于内部分析

隐藏的监控头

X-System-Status: normal
X-Request-Count: 3
X-Reset-Time: 2024-01-02T00:00:00Z

监控和日志

日志记录

  • 记录所有被阻止的请求
  • 包含IP地址、User-Agent、Referer等信息
  • 便于安全分析和威胁检测

统计信息

stats := middleware.GetStats()
// 返回配置信息和安全特性状态

性能考虑

Redis优化

  • 使用Pipeline减少网络往返
  • 设置合理的TTL避免内存泄漏
  • 键名设计便于批量操作

内存使用

  • 计数器自动过期
  • 并发限制使用短期TTL
  • 避免无限增长

安全最佳实践

1. 配置建议

  • 启用User-Agent检测
  • 启用Referer验证
  • 启用代理检测
  • 定期更新黑名单

2. 监控建议

  • 监控被阻止的请求数量
  • 分析攻击模式
  • 及时调整安全策略

3. 部署建议

  • 在生产环境中启用所有安全特性
  • 根据业务需求调整限制参数
  • 定期审查和更新配置

故障排除

常见问题

  1. 误杀正常请求

    • 检查User-Agent白名单
    • 调整Referer允许列表
    • 检查IP白名单配置
  2. 性能问题

    • 调整并发限制参数
    • 检查Redis性能
    • 优化键名设计
  3. 配置不生效

    • 检查配置文件语法
    • 确认中间件已正确注册
    • 验证依赖注入

总结

每日请求限制中间件提供了一个强大而全面的解决方案来防护恶意请求。通过多层安全检查和隐蔽的限制机制有效防止API滥用保护系统资源同时为正常用户提供良好的使用体验。

该中间件特别适合需要控制成本的API接口通过精确的访问控制确保每次请求都来自合法用户避免恶意攻击造成的资源浪费。