题目
如何防止SQL注入攻击?
信息
- 类型:问答
- 难度:⭐
考点
SQL注入原理,参数化查询,输入验证
快速回答
防止SQL注入的核心方法是:
- 使用参数化查询(预编译语句)替代字符串拼接
- 对用户输入进行严格验证和过滤
- 遵循最小权限原则配置数据库账户
- 避免直接显示数据库错误信息给用户
1. SQL注入原理
SQL注入是攻击者通过在用户输入中插入恶意SQL代码,篡改原始SQL语句逻辑的攻击方式。例如:
# 危险示例:字符串拼接查询
username = request.GET.get('user')
sql = "SELECT * FROM users WHERE name = '" + username + "'"
# 若用户输入 `admin' OR '1'='1` 将返回所有数据2. 防御方法
2.1 参数化查询(最佳实践)
使用数据库驱动的参数化接口,确保输入数据始终被当作数据处理:
# Python示例(使用SQLite)
import sqlite3
conn = sqlite3.connect('db.sqlite')
cursor = conn.cursor()
# 正确做法:使用?占位符
cursor.execute("SELECT * FROM users WHERE name = ?", (username,))2.2 输入验证
- 白名单验证:对已知格式的数据(如邮箱、电话)进行格式校验
- 类型检查:确保数字参数使用
int()等转换 - 长度限制:防止超长恶意输入
2.3 其他防御措施
- 最小权限原则:数据库账户仅授予必要权限
- 错误处理:记录错误日志但不返回详细数据库信息给客户端
- Web防火墙:部署WAF拦截常见攻击模式
3. 常见错误
- ❌ 手动拼接SQL语句
- ❌ 使用字符串替换函数(如
replace())过滤单引号 - ❌ 仅依赖前端验证(攻击者可绕过)
4. 扩展知识
- ORM框架:如SQLAlchemy、Django ORM等自动使用参数化查询
- 二次注入:即使经过转义存入数据库的数据,在读取后再次拼接使用时仍可能触发注入
- 工具检测:使用SQLMap等工具定期进行漏洞扫描