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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40