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状态码
工作流程:
- 序列化每个Action参数为JSON
- 使用
SqlInjectionHelper.ContainsSqlInjection
检测是否包含注入模式 - 如检测到注入,记录警告日志并返回403响应
- 否则,继续执行请求
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=1
和1'='1
等常见注入模式 - 提供参数清理方法,替换或移除危险字符
- 提供参数安全化处理,如单引号转义
4. 集成方式
在Booter.cs
中将过滤器注册到MVC过滤器管道:
.AddControllers(
option =>
{
// 其他过滤器
option.Filters.Add<SqlInjectionFilter>();//SQL注入防护
}
)
5. 优势与限制
优势:
- 无需修改现有业务代码
- 在框架层统一处理SQL注入问题
- 可记录攻击详情,便于安全审计
- 适用于所有FromBody参数
限制:
- 可能存在误报,需根据业务场景调整正则表达式
- 无法替代参数化查询的安全性
- 对复杂或加密的注入攻击检测有限
6. 最佳实践建议
- 此防护作为安全的第一道防线,长期仍建议使用参数化查询
- 定期更新SQL注入模式库,应对新型攻击
- 结合日志监控,分析攻击模式
- 对误报模式进行白名单处理