# 工作原理
-
正常查询:应用程序将用户输入直接拼接到 SQL 语句中
sql
SELECT * FROM users WHERE username = '用户输入' AND password = '用户输入'
- 注入攻击:攻击者输入特殊构造的字符串
用户名: admin' -- 密码: [任意]
生成的 SQL 语句变为:
sql
SELECT * FROM users WHERE username = 'admin' --' AND password = '任意'
-
是 SQL 注释符号,使得密码检查被忽略
# 常见攻击类型
- 基于错误的注入:通过错误消息获取数据库信息
- 联合查询注入:使用 UNION 操作获取其他表数据
- 布尔盲注:通过真 / 假响应推断数据
- 时间盲注:通过数据库响应延迟推断信息
- 堆叠查询:执行多个 SQL 语句
# 危害
- 绕过认证
- 窃取敏感数据
- 修改或删除数据
- 执行管理员操作
- 完全控制数据库服务器
# 防御措施
-
使用参数化查询 (预编译语句)
python
# 正确做法 cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
- 输入验证和过滤
- 最小权限原则:数据库账户只授予必要权限
- 使用 ORM 框架
- 定期更新和打补丁
- 错误处理:不向用户显示详细数据库错误