如何在 Python 中安全地查询 MySQL 中匹配用户名和密码的用户记录

17次阅读

如何在 Python 中安全地查询 MySQL 中匹配用户名和密码的用户记录

本文讲解如何正确使用参数化查询从 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免费学习笔记(深入)”;

text=ZqhQzanResources