本文详解如何正确使用参数化查询从mysql数据库中检索匹配指定用户名和密码的单行用户数据,避免sql注入风险,并修正常见语法错误。
在实现登录功能时,一个常见误区是试图用 LIKE 或逗号分隔的方式一次性匹配多个字段(如 WHERE username, password LIKE '%s','%s'),这在SQL中语法非法,且存在严重安全隐患。正确的做法是分别对每个字段进行精确比较,并使用逻辑运算符 AND 连接条件。
# 假设已建立合法数据库连接 conn 和游标 cursor
cursor.execute("SELECT * FROM user WHERE username = %s AND password = %s", (username, password))
ecreds = cursor.fetchall()
if len(ecreds) == 1:
print("Login successful. Welcome, " + ecreds[0][1]) # 假设第二列为姓名或昵称
else:
print("Invalid username or password.")? 关键改进说明: 使用 %s 占位符 + 元组传参,由 MySQL 驱动自动完成类型转换与转义,彻底杜绝 SQL 注入; = 实现精确匹配(非模糊匹配),符合登录认证逻辑; AND 确保两个条件同时满足,语义清晰、性能高效。
import bcrypt
# 查询时仅取哈希密码字段
cursor.execute("SELECT password_hash FROM user WHERE username = %s", (username,))
stored_
hash = cursor.fetchone()[0]
if bcrypt.checkpw(password.encode('utf-8'), stored_hash.encode('utf-8')):
print("Authentication succeeded.")cursor.execute("SELECT id, name FROM user WHERE username = %s AND password = %s", (username, password))
user = cursor.fetchone()
if user:
print(f"Login successful. Welcome, {user[1]}")登录验证的核心在于安全、精确、可维护:用参数化查询替代字符串拼接,用 = 替代错误的多列 LIKE 语法,配合密码哈希处理,才能构建健壮可靠的认证逻辑。务必以防御性编程思维设计每一处数据库交互。