Skip to content

🛡️ SQL注入拦截器

📖 简介

SQL注入拦截器是一个强大的安全过滤器,用于检测和阻止SQL注入攻击。它通过分析请求参数、请求体和请求头中的内容,识别潜在的SQL注入模式,并根据配置采取相应的防护措施。

为什么需要SQL注入拦截?

  • 防止恶意用户通过SQL注入攻击获取敏感数据
  • 保护后端数据库免受未授权访问
  • 提供多层次的安全防护
  • 支持自定义检测规则和白名单机制

⚙️ 配置结构

yaml
gateway:
  filter:
    sql-injection:
      enabled: true  # 启用SQL注入拦截
      rules:
        - name: "rule-name"
          urls:
            - "/api/**"
          forbidUrls:
            - "/api/health"
          action: "block"
          sensitivity: "medium"
          customPatterns:
            - "(?i)\\b(exec|execute)\\s*\\("
          whitelistPatterns:
            - "(?i)\\bselect\\s+version\\(\\)"

📋 配置参数说明

基本配置

配置项类型必填默认值说明
enabledbooleanfalse是否启用SQL注入拦截器
rulesarray[]SQL注入拦截规则列表

规则配置

配置项类型必填默认值说明
namestring-规则名称,用于标识和日志记录
urlsarray[]需要检查的URL路径模式列表
forbidUrlsarray[]排除检查的URL路径模式列表
actionstring"block"检测到SQL注入时的处理动作
sensitivitystring"medium"检测敏感度级别
customPatternsarray[]自定义检测正则表达式模式
whitelistPatternsarray[]白名单正则表达式模式

处理动作说明

动作值说明
block阻止请求并返回403错误
log仅记录日志,允许请求继续
both既阻止请求又记录详细日志

敏感度级别说明

级别说明适用场景
low低敏感度,只检测明显的SQL注入模式公开API,减少误报
medium中等敏感度,平衡检测效果和误报率一般业务接口
high高敏感度,检测更多潜在威胁管理接口,敏感操作

🔍 检测模式

内置检测模式

拦截器内置了大量SQL注入检测模式,包括:

基础SQL关键字

  • UNION, SELECT, INSERT, UPDATE, DELETE
  • DROP, CREATE, ALTER, EXEC, EXECUTE
  • 条件注入:OR 1=1, AND 1=1
  • 字符串注入:' OR 'a'='a', " OR "a"="a"

数据库函数

  • 信息收集:@@version, user(), database()
  • 字符串函数:concat(), substring(), ascii()
  • 时间延迟:sleep(), waitfor delay
  • 文件操作:load_file(), into outfile

高级注入技术

  • 盲注技术:if(), case when
  • 联合查询:union select
  • 子查询注入
  • 存储过程调用

自定义检测模式

支持使用正则表达式定义自定义检测模式:

yaml
customPatterns:
  - "(?i)\\b(exec|execute)\\s*\\("  # 检测存储过程执行
  - "(?i)\\b(script|javascript):"   # 检测脚本注入
  - "(?i)\\b(eval|setTimeout)\\s*\\(" # 检测代码执行

白名单机制

对于合法的SQL语句或特定业务需求,可以使用白名单排除:

yaml
whitelistPatterns:
  - "(?i)\\bselect\\s+version\\(\\)"           # 允许版本查询
  - "(?i)\\bshow\\s+tables\\s+like\\s+'test_%'" # 允许测试表查询
  - "(?i)\\bselect\\s+count\\(\\*\\)\\s+from"    # 允许计数查询

📝 配置示例

基础配置

yaml
gateway:
  filter:
    sql-injection:
      enabled: true
      rules:
        - name: "basic-protection"
          urls:
            - "/api/**"
          action: "block"
          sensitivity: "medium"

多规则配置

yaml
gateway:
  filter:
    sql-injection:
      enabled: true
      rules:
        # API接口保护
        - name: "api-protection"
          urls:
            - "/api/**"
            - "/v1/**"
          forbidUrls:
            - "/api/health"
            - "/api/metrics"
          action: "block"
          sensitivity: "medium"
        
        # 管理接口高级保护
        - name: "admin-protection"
          urls:
            - "/admin/**"
          action: "both"
          sensitivity: "high"
          customPatterns:
            - "(?i)\\b(drop|truncate)\\s+table"
            - "(?i)\\b(grant|revoke)\\s+all"
        
        # 用户接口宽松保护
        - name: "user-protection"
          urls:
            - "/user/**"
          action: "log"
          sensitivity: "low"
          whitelistPatterns:
            - "(?i)\\bselect\\s+\\*\\s+from\\s+user_profile"

高级自定义配置

yaml
gateway:
  filter:
    sql-injection:
      enabled: true
      rules:
        - name: "comprehensive-protection"
          urls:
            - "/**"
          forbidUrls:
            - "/health"
            - "/metrics"
            - "/static/**"
          action: "both"
          sensitivity: "high"
          customPatterns:
            # 检测存储过程执行
            - "(?i)\\b(exec|execute|sp_executesql)\\s*\\("
            # 检测系统函数调用
            - "(?i)\\b(xp_cmdshell|openrowset|opendatasource)"
            # 检测注释绕过
            - "(?i)/\\*.*?\\*/|--.*?$|#.*?$"
            # 检测编码绕过
            - "(?i)\\b(char|ascii|hex|unhex)\\s*\\("
            # 检测时间盲注
            - "(?i)\\b(sleep|benchmark|waitfor\\s+delay)\\s*\\("
          whitelistPatterns:
            # 允许特定的业务查询
            - "(?i)\\bselect\\s+\\*\\s+from\\s+user_profile\\s+where\\s+id\\s*=\\s*\\?"
            - "(?i)\\bupdate\\s+user_settings\\s+set\\s+.*\\s+where\\s+user_id\\s*=\\s*\\?"
            # 允许系统监控查询
            - "(?i)\\bshow\\s+(status|variables|processlist)"
            - "(?i)\\bselect\\s+version\\(\\)"

🚨 安全建议

1. 敏感度设置

  • 生产环境:建议使用 mediumhigh 敏感度
  • 开发环境:可以使用 low 敏感度减少干扰
  • 管理接口:强烈建议使用 high 敏感度

2. 检查范围

  • API接口:建议同时检查参数和请求体
  • 管理接口:建议检查参数、请求体和请求头
  • 静态资源:建议排除检查以提高性能

3. 处理动作

  • 关键接口:使用 blockboth 动作
  • 日志分析:使用 log 动作收集攻击情报
  • 渐进部署:先使用 log 观察,再切换到 block

4. 白名单管理

  • 定期审查白名单规则的必要性
  • 使用最小权限原则,只允许必要的SQL模式
  • 为白名单规则添加详细注释说明用途

5. 监控和告警

  • 监控SQL注入拦截日志
  • 设置告警机制,及时发现攻击趋势
  • 定期分析误报情况,优化检测规则

📊 性能考虑

1. 正则表达式优化

  • 避免使用过于复杂的正则表达式
  • 合理使用预编译正则表达式缓存
  • 定期评估自定义模式的性能影响

2. 检查范围控制

  • 根据业务需求合理设置检查范围
  • 对静态资源和健康检查接口进行排除
  • 使用 forbidUrls 排除不需要检查的路径

3. 敏感度平衡

  • 在安全性和性能之间找到平衡点
  • 根据接口重要性设置不同的敏感度
  • 定期评估和调整敏感度设置

🔧 故障排除

常见问题

  1. 误报过多

    • 降低敏感度级别
    • 添加白名单规则
    • 检查自定义模式是否过于严格
  2. 性能影响

    • 优化正则表达式
    • 减少检查范围
    • 使用 forbidUrls 排除不必要的检查
  3. 漏报问题

    • 提高敏感度级别
    • 添加自定义检测模式
    • 检查URL匹配规则是否正确

调试技巧

  1. 启用调试日志

    yaml
    log:
      level: "debug"
  2. 使用日志模式测试

    yaml
    action: "log"  # 先记录不阻止

📈 最佳实践

  1. 分层防护:结合其他安全过滤器使用
  2. 定期更新:及时更新检测模式库
  3. 监控分析:建立完善的安全监控体系
  4. 应急响应:制定SQL注入攻击应急预案
  5. 安全培训:提高开发团队的安全意识

通过合理配置SQL注入拦截器,可以有效提升系统的安全防护能力,保护后端数据库免受恶意攻击。