You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+SQLite3登录验证:如何分别提示用户名/密码错误

解决方案

要实现分别提示用户名或密码错误的功能,需要先查询数据库中是否存在输入的用户名,再针对性对比密码。先修正原代码的核心问题,再实现正确逻辑:

错误点分析

  1. SQL注入风险:原代码用字符串拼接%s生成SQL语句,存在注入攻击隐患,必须使用参数化查询。
  2. 循环逻辑错误:fetchall()返回行数据的列表,for i in values中的i是完整行记录(如元组)而非索引,values[i]会触发类型错误。
  3. 连接管理不当:循环内提前关闭连接,且最后conn.close缺少括号,无法正确释放连接资源。

正确实现代码

def check_login_on_db():
    enteredUsername = log_in_window_username_entry.get()
    enteredPassword = log_in_window_password_entry.get()

    # 用with语句自动管理数据库连接,无需手动调用close
    with sqlite3.connect('database.db') as conn:
        cursor = conn.cursor()
        # 参数化查询,避免SQL注入,仅查询所需的密码字段
        cursor.execute('SELECT password FROM SignUpDetails WHERE username = ?', (enteredUsername,))
        result = cursor.fetchone()

        if not result:
            # 未查询到记录,提示用户名错误
            log_in_additional_info.config(text="This username is incorrect")
        else:
            stored_password = result[0]
            if stored_password != enteredPassword:
                # 密码不匹配,提示密码错误
                log_in_additional_info.config(text="The password is incorrect")
            else:
                # 登录成功,清空提示信息
                log_in_additional_info.config(text="")
                # 此处可添加登录成功后的后续逻辑,如页面跳转、状态更新等

逻辑说明

  1. 参数化查询:用?作为占位符,搭配参数元组传递输入值,既安全又避免字符串拼接的格式错误。
  2. 结果判断:fetchone()返回查询到的第一行数据(仅需查询密码字段,无需SELECT *),返回None则说明数据库中无该用户名。
  3. 密码对比:若存在目标用户名,取出存储的密码与输入值对比,分别给出对应错误提示。

内容的提问来源于stack exchange,提问作者Gurcharan5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:50:09