外观
🛡️ 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\\(\\)"
📋 配置参数说明
基本配置
配置项 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
enabled | boolean | 是 | false | 是否启用SQL注入拦截器 |
rules | array | 是 | [] | SQL注入拦截规则列表 |
规则配置
配置项 | 类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
name | string | 是 | - | 规则名称,用于标识和日志记录 |
urls | array | 是 | [] | 需要检查的URL路径模式列表 |
forbidUrls | array | 否 | [] | 排除检查的URL路径模式列表 |
action | string | 否 | "block" | 检测到SQL注入时的处理动作 |
sensitivity | string | 否 | "medium" | 检测敏感度级别 |
customPatterns | array | 否 | [] | 自定义检测正则表达式模式 |
whitelistPatterns | array | 否 | [] | 白名单正则表达式模式 |
处理动作说明
动作值 | 说明 |
---|---|
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. 敏感度设置
- 生产环境:建议使用
medium
或high
敏感度 - 开发环境:可以使用
low
敏感度减少干扰 - 管理接口:强烈建议使用
high
敏感度
2. 检查范围
- API接口:建议同时检查参数和请求体
- 管理接口:建议检查参数、请求体和请求头
- 静态资源:建议排除检查以提高性能
3. 处理动作
- 关键接口:使用
block
或both
动作 - 日志分析:使用
log
动作收集攻击情报 - 渐进部署:先使用
log
观察,再切换到block
4. 白名单管理
- 定期审查白名单规则的必要性
- 使用最小权限原则,只允许必要的SQL模式
- 为白名单规则添加详细注释说明用途
5. 监控和告警
- 监控SQL注入拦截日志
- 设置告警机制,及时发现攻击趋势
- 定期分析误报情况,优化检测规则
📊 性能考虑
1. 正则表达式优化
- 避免使用过于复杂的正则表达式
- 合理使用预编译正则表达式缓存
- 定期评估自定义模式的性能影响
2. 检查范围控制
- 根据业务需求合理设置检查范围
- 对静态资源和健康检查接口进行排除
- 使用
forbidUrls
排除不需要检查的路径
3. 敏感度平衡
- 在安全性和性能之间找到平衡点
- 根据接口重要性设置不同的敏感度
- 定期评估和调整敏感度设置
🔧 故障排除
常见问题
误报过多
- 降低敏感度级别
- 添加白名单规则
- 检查自定义模式是否过于严格
性能影响
- 优化正则表达式
- 减少检查范围
- 使用
forbidUrls
排除不必要的检查
漏报问题
- 提高敏感度级别
- 添加自定义检测模式
- 检查URL匹配规则是否正确
调试技巧
启用调试日志
yamllog: level: "debug"
使用日志模式测试
yamlaction: "log" # 先记录不阻止
📈 最佳实践
- 分层防护:结合其他安全过滤器使用
- 定期更新:及时更新检测模式库
- 监控分析:建立完善的安全监控体系
- 应急响应:制定SQL注入攻击应急预案
- 安全培训:提高开发团队的安全意识
通过合理配置SQL注入拦截器,可以有效提升系统的安全防护能力,保护后端数据库免受恶意攻击。