Flask注册时校验常见密码逻辑失效,用户仍被创建如何解决?
问题根因
- 核心逻辑错误:你将创建用户的操作写在了弱密码遍历循环的else分支中,只要输入的密码和第一个读取到的弱密码不匹配,就会直接执行注册逻辑并跳转到登录页,完全不会继续校验剩余的弱密码。比如弱密码文件第一行是
123456,用户输入第二行的弱密码111111,第一次循环判断不相等就直接注册成功,不会校验到第二行内容。 - 逻辑漏洞:就算密码命中了某一行弱密码触发了flash提示,你也没有终止后续流程,循环会继续执行,后续只要遇到不匹配的行依然会触发注册。
修复方案
调整校验逻辑,先完成所有弱密码的匹配校验,确认密码不属于弱密码后,再执行注册操作:
@bp.route("/register", methods=["GET", "POST"]) def register(): form = RegistrationForm() if form.validate_on_submit(): # 读取弱密码列表,用集合存储查询效率更高 with open("VanligePassord.txt", encoding="utf-8") as f: weak_pwd_set = {line.strip() for line in f} # 命中弱密码直接提示,不执行注册 if form.password.data in weak_pwd_set: flash("Passordet ditt er for svakt") else: # 确认密码安全再创建用户 user = User(username=form.username.data) user.set_password(form.password.data) db.session.add(user) db.session.commit() return redirect(url_for("auth.login")) return render_template("auth/register.html", form=form)
优化建议
- 弱密码列表是固定内容,不需要每次用户请求都重新读取文件,可以在应用启动时一次性加载到内存中,减少IO开销提升性能。
- 读取文件行时使用
strip()去除换行符和首尾空白字符,比line[:-1]更稳妥,避免文件末尾行无换行符导致的匹配误差。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

