首页/安全/漏洞与攻击面速查/SQL 注入原理与防护
本包目录(294 条)
漏洞基础与评分46 条
Web 漏洞原理与防护55 条
主机与服务风险面53 条扫描与验证方法50 条补丁与修复管理45 条暴露面收敛45 条

SQL 注入原理与防护

SQL 注入源于把用户输入直接拼接进 SQL 语句,使输入被当作代码执行;防护核心是参数化查询(预编译)与最小权限账号,输入过滤与 WAF 只能作为兜底。

漏洞与攻击面速查安全更新于 2026-10-12
成因字符串拼接 SQL,输入未与语句结构分离
影响数据读取/篡改/删除,特定条件下可扩大到命令执行
根治参数化查询 / 预编译语句
兜底最小权限账号、统一错误处理、WAF

拼接与参数化对比

拼接与参数化对比
危险:"SELECT * FROM users WHERE name = '" + name + "'"
安全(Python/DB-API):cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
安全(Java):PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE name = ?"); ps.setString(1, name);

数据库最小权限示例

数据库最小权限示例
CREATE USER 'app'@'10.%' IDENTIFIED BY '<强随机口令>';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.%';
-- 业务账号不给 FILE、DROP、GRANT 等能力
参数化让数据库把输入当数据而非语句;无法参数化的位置(表名、排序字段)用白名单映射,详见排序参数条目。

易错点

  • 分页参数做了参数化但 ORDER BY 字段仍是拼接:拼接点不止 WHERE
  • 用转义函数替代参数化不可靠:字符集与数据库差异会造成绕过

数据来源与参考

  • OWASP SQL Injection Prevention Cheat Sheet
  • MySQL 8.0 Reference Manual(Prepared Statements)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌