Flask用户名密码验证问题:已知账号登录校验失败求助
问题分析与修复
你的登录验证逻辑存在几个关键问题,导致正确的用户名和密码也无法通过验证:
核心错误点
- 循环逻辑错误:当前代码只检查文件的第一行用户,若第一行不匹配就直接返回错误,后续用户条目完全没机会被校验。
- 未处理换行符:读取文件行时,每行末尾的
\n会被保留,split后的用户名可能带有换行符,导致和输入的用户名不匹配。 - 文件资源未正确管理:直接用
open()打开文件但未关闭,可能引发资源泄漏。 - 密码哈希索引可能错误:假设你的
users.txt格式是用户名,密码哈希,那么login_info[2]会索引越界,应该用login_info[1](需确认你的文件格式,以下按常规格式修正)。
修正后的Python代码
@app.route('/LoginSuccess/', methods=['GET', 'POST']) def login_success(): username = request.form.get("username") password = request.form.get("password") flash('Verifying inputs....') # 使用with语句安全管理文件资源 with open('users.txt', 'r') as f: for line in f.readlines(): # 去除行尾的换行符,再分割 line = line.strip() if not line: # 跳过空行 continue login_info = line.split(',') # 假设users.txt格式是"username,hashpass",索引对应0和1 if len(login_info) != 2: continue # 跳过格式错误的行 stored_username = login_info[0] hashpass = login_info[1] if username == stored_username: flash('Username correct') if sha256_crypt.verify(password, hashpass): flash('You are logged in!') return render_template('index.html') else: flash('Incorrect password. Please try again.') return render_template('login.html', username=username) # 遍历完所有用户都没匹配到才返回错误 flash('Incorrect data. Please try again.') return render_template('login.html', username=username)
额外注意事项
- 确认
users.txt的格式:每行必须是用户名,加密后的密码,例如alice,$5$rounds=535000$example$abc123...,不要有多余的逗号或空格。 - 注册用户时,确保密码是用
sha256_crypt.encrypt(password)正确加密后写入文件的,加密逻辑和验证逻辑要完全对应。
内容的提问来源于stack exchange,提问作者evogamer
相关产品推荐
相关产品推荐

