题目
防止SQL注入的基本方法
信息
- 类型:问答
- 难度:⭐
考点
SQL注入原理,参数化查询,输入验证
快速回答
防止SQL注入的核心方法是:
- 使用参数化查询(预编译语句)替代字符串拼接
- 对用户输入进行严格验证和过滤
- 遵循最小权限原则配置数据库账户
- 避免直接显示数据库错误信息给用户
1. 原理说明
SQL注入是攻击者通过在用户输入中插入恶意SQL代码,篡改原始SQL语句逻辑的攻击方式。例如:
-- 原始语句
SELECT * FROM users WHERE username = '[user_input]'
-- 当用户输入:admin' OR '1'='1
-- 最终执行:
SELECT * FROM users WHERE username = 'admin' OR '1'='1'这将返回所有用户数据,导致未授权访问。
2. 危险代码示例
# 危险:字符串拼接方式
username = request.GET.get('username')
sql = "SELECT * FROM users WHERE username = '" + username + "'"
cursor.execute(sql)3. 最佳实践解决方案
使用参数化查询(预编译语句):
# 安全:参数化查询
username = request.GET.get('username')
sql = "SELECT * FROM users WHERE username = %s"
cursor.execute(sql, (username,)) # 数据库会自动处理特殊字符补充防御措施:
- 输入验证: 对输入进行格式检查(如长度、字符类型)
if not username.isalnum(): raise Exception("Invalid input") - 最小权限: 数据库账户仅授予必要权限(禁止DROP/ALTER等)
- 错误处理: 记录错误日志但不返回详细数据库错误给客户端
4. 常见错误
- 手动拼接SQL语句(即使尝试过滤特殊字符)
- 仅依赖前端验证(攻击者可绕过前端直接调用API)
- 使用黑名单过滤(容易遗漏特殊字符或编码变体)
5. 扩展知识
- ORM框架: 使用SQLAlchemy、Django ORM等会自动处理参数化查询
- 二次注入: 即使入库时转义,读取后再次拼接SQL仍可能触发
- 自动化工具: SQLMap等工具可自动检测注入漏洞