
本文讲解如何正确使用参数化查询从 mysql 表中检索同时匹配用户名和密码的单行数据,避免 sql 注入风险,并修正常见的语法与逻辑错误。
在实现登录功能时,一个常见误区是试图用 LIKE 或逗号分隔的方式一次性比对多个字段(如 WHERE username, password LIKE '%s','%s'),这在 SQL 中语法非法,也不会按预期工作。MySQL 不支持这种元组式匹配语法;必须对每个字段单独指定条件,并用逻辑运算符(如 AND)连接。
✅ 正确写法应使用参数化查询(即预编译语句),将变量作为参数传入 execute() 方法,由数据库驱动自动处理转义与类型适配:
cursor.execute("SELECT * FROM user WHERE username = %s AND password = %s", (username, password))
ecreds = cursor.fetchall()⚠️ 注意事项:
- 严禁使用字符串格式化(如 % 或 .format())拼接 SQL:这极易导致 SQL 注入 漏洞,攻击者可通过构造恶意输入(如 ' OR '1'='1)绕过认证。
- 密码绝不应明文存储或比对:生产环境中必须使用强哈希算法(如 bcrypt 或 argon2)对密码哈希后存入数据库,并在验证时比对哈希值。示例:
import bcrypt # 登录时验证 if bcrypt.checkpw(password.encode('utf-8'), stored_hash): print("Login successful. Welcome, " + username) - fetchall() 返回的是列表,即使只有一条匹配记录,也需通过索引访问(如 ecreds[0]);若仅需验证是否存在,推荐用 fetchone() 更高效:
user = cursor.fetchone() if user: print("Login successful. Welcome, " + user['username']) # 若使用字典游标
? 总结:始终坚持「参数化查询 + 密码哈希 + 显式字段条件」三原则,才能构建安全、健壮的用户认证逻辑。
立即学习“Python免费学习笔记(深入)”;










