Python+SQLite3登录验证:如何分别提示用户名/密码错误
解决方案
要实现分别提示用户名或密码错误的功能,需要先查询数据库中是否存在输入的用户名,再针对性对比密码。先修正原代码的核心问题,再实现正确逻辑:
错误点分析
- SQL注入风险:原代码用字符串拼接
%s生成SQL语句,存在注入攻击隐患,必须使用参数化查询。 - 循环逻辑错误:
fetchall()返回行数据的列表,for i in values中的i是完整行记录(如元组)而非索引,values[i]会触发类型错误。 - 连接管理不当:循环内提前关闭连接,且最后
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="") # 此处可添加登录成功后的后续逻辑,如页面跳转、状态更新等
逻辑说明
- 参数化查询:用
?作为占位符,搭配参数元组传递输入值,既安全又避免字符串拼接的格式错误。 - 结果判断:
fetchone()返回查询到的第一行数据(仅需查询密码字段,无需SELECT *),返回None则说明数据库中无该用户名。 - 密码对比:若存在目标用户名,取出存储的密码与输入值对比,分别给出对应错误提示。
内容的提问来源于stack exchange,提问作者Gurcharan5
相关产品推荐
相关产品推荐

