1. 整体架构

采用过滤器(Filter)模式实现SQL注入防护,通过在请求处理管道中拦截并检查所有请求参数,防止SQL注入攻击。

2. 核心组件

2.1 SqlInjectionHelper

位置: Framework.API.Utility.SqlInjectionHelper

功能:

  • 提供SQL注入检测的通用方法
  • 维护SQL注入模式的正则表达式库
  • 提供内容清理和参数安全处理方法

关键方法:

  • ContainsSqlInjection(string content): 检测内容是否包含SQL注入模式
  • CleanSqlInjection(string content): 清理可能包含SQL注入的内容
  • SafeSqlParameter(string value): 安全地构建SQL参数

2.2 SqlInjectionFilter

位置: Framework.API.Filter.SqlInjectionFilter

功能:

  • 实现IAsyncActionFilter接口
  • 在控制器Action执行前检查所有参数
  • 拦截包含SQL注入模式的请求并返回403状态码

工作流程:

  1. 序列化每个Action参数为JSON
  2. 使用SqlInjectionHelper.ContainsSqlInjection检测是否包含注入模式
  3. 如检测到注入,记录警告日志并返回403响应
  4. 否则,继续执行请求

3. SQL注入检测策略

3.1 检测模式

使用30多种正则表达式模式检测常见SQL注入攻击,包括:

  • SQL关键字检测 (SELECT, INSERT, UPDATE, DELETE等)
  • 条件操作符检测 (OR 1=1, AND 1=1等)
  • 注释符号检测 (--, /**/等)
  • UNION注入检测 (UNION SELECT等)
  • 系统表访问检测 (INFORMATION_SCHEMA, SYSOBJECTS等)
  • 时间延迟注入检测 (WAITFOR, DELAY等)

3.2 防护措施

  • 对请求参数进行URL解码和HTML解码,防止绕过检测
  • 特别检查1=11'='1等常见注入模式
  • 提供参数清理方法,替换或移除危险字符
  • 提供参数安全化处理,如单引号转义

4. 集成方式

Booter.cs中将过滤器注册到MVC过滤器管道:

.AddControllers(
    option =>
    {
        // 其他过滤器
        option.Filters.Add<SqlInjectionFilter>();//SQL注入防护
    }
)

5. 优势与限制

优势:

  • 无需修改现有业务代码
  • 在框架层统一处理SQL注入问题
  • 可记录攻击详情,便于安全审计
  • 适用于所有FromBody参数

限制:

  • 可能存在误报,需根据业务场景调整正则表达式
  • 无法替代参数化查询的安全性
  • 对复杂或加密的注入攻击检测有限

6. 最佳实践建议

  1. 此防护作为安全的第一道防线,长期仍建议使用参数化查询
  2. 定期更新SQL注入模式库,应对新型攻击
  3. 结合日志监控,分析攻击模式
  4. 对误报模式进行白名单处理