SQL 注入防护清单:参数化查询、最小权限与审计策略
SQL 注入并不是“老漏洞”,而是“老问题的新写法”。越是业务复杂、动态查询多的系统,越容易在边角逻辑里重新出现拼接 SQL。防护要靠体系,不靠单点补丁。
1. 参数化查询是底线,不是建议
核心原则只有一个:数据和 SQL 结构必须分离。用户输入只能作为参数值,不能参与 SQL 语法拼接。无论你用原生驱动还是 ORM,这条都不能破。
- 正确:`WHERE id = ?` + 参数绑定
- 错误:`WHERE id = ` + 用户输入拼接
2. ORM 也会踩坑,特别是动态排序和筛选
很多注入来自“以为 ORM 自动安全”。高风险点通常是:
- 动态 `ORDER BY` 字段直接拼接
- 动态表名、列名未做白名单
- 原生 SQL escape 使用不当
建议对可变字段做白名单映射,不要把前端传来的字符串直接放进查询模板。
3. 数据库权限按“最小可用”拆分
即使出现注入,也要让破坏面受限。推荐至少拆分:
- 只读账号:查询报表、检索接口
- 读写账号:核心业务写操作
- 运维账号:DDL、迁移、管理命令(线上禁用)
应用账号不要有 `DROP`、`ALTER` 等高危权限。
4. 输入校验和 WAF 是“第二道防线”
参数化是第一道。输入校验和 WAF 用于拦截异常模式和高风险流量,但不应替代代码层防护。
- 关键参数做类型和长度约束
- 异常 payload 命中后进入风控与告警
- 高危路径配置更严格的速率限制
5. 审计和回放能力决定恢复速度
防护之外,还要能快速确认是否被利用:
- 记录 SQL 执行摘要、请求 ID、用户 ID
- 保留慢查询与异常错误栈
- 高危操作触发实时告警
安全工作的目标不是“绝不出问题”,而是“出了问题可定位、可遏制、可恢复”。
上线前自查清单
- 所有写接口已排查拼接 SQL 风险。
- 动态查询字段全部经过白名单映射。
- 数据库账号按最小权限拆分完成。
- WAF/审计日志可关联到应用请求链路。
把这四项做扎实,SQL 注入风险会显著下降。