题目
识别并修复简单的SQL注入漏洞
信息
- 类型:问答
- 难度:⭐
考点
SQL注入原理,参数化查询,输入验证
快速回答
SQL注入是通过恶意输入篡改SQL查询的攻击手段。防御核心方法:
- 使用参数化查询(预编译语句)替代字符串拼接
- 对输入进行严格验证(白名单过滤)
- 最小化数据库权限
1. 原理说明
SQL注入是攻击者通过在输入字段插入恶意SQL代码,篡改原始SQL查询逻辑的攻击方式。例如:当使用字符串拼接构造SQL时,输入 ' OR '1'='1 可能绕过登录验证。
2. 漏洞代码示例
# 危险!字符串拼接查询
username = request.form['username']
password = request.form['password']
sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"
# 若输入 username: admin'--
# 查询变为:SELECT * FROM users WHERE username='admin'-- ' AND password=''3. 修复方案(参数化查询)
# 安全:使用参数化查询
import sqlite3
conn = sqlite3.connect('db.sqlite')
cursor = conn.cursor()
# 使用 ? 作为占位符
cursor.execute(
"SELECT * FROM users WHERE username=? AND password=?",
(username, password) # 参数自动转义
)4. 最佳实践
- 始终使用参数化查询:所有主流语言都支持(Java的PreparedStatement,PHP的PDO等)
- 输入验证:对用户名等输入使用正则表达式限制字符(如
^[a-z0-9_]{3,20}$) - 深度防御:数据库连接使用最小权限账户,避免使用SA账号
5. 常见错误
- 尝试手动转义特殊字符(易遗漏如
\的边界情况) - 仅在前端验证(攻击者可绕过前端直接提交恶意数据)
- 依赖黑名单过滤(如仅过滤
SELECT,UNION等关键词)
6. 扩展知识
- ORM框架:如SQLAlchemy、Hibernate等自动使用参数化查询
- 二次注入:即使使用参数化查询,存储未净化的数据后再次查询仍可能触发注入
- 工具检测:使用SQLMap等工具自动化检测注入漏洞