| 成因 | 字符串拼接 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 等能力参数化让数据库把输入当数据而非语句;无法参数化的位置(表名、排序字段)用白名单映射,详见排序参数条目。