如果用户的密码与文本文件中的值匹配,则阻止创建用户

prevent creating a user if their password matches a value in a text file

当用户向 Flask 提交注册表单时,我想根据一个包含 10000 个常用密码的文件检查他们选择的密码。如果他们的密码与通用值匹配,我想显示一条消息而不是创建用户。

我写了下面的代码,但它总是创建用户,即使他们输入一个常用密码也是如此。我写的支票有什么问题?

@bp.route("/register", methods=["GET", "POST"])
def register():
    form = RegistrationForm()
    
    if form.validate_on_submit():
        user = User(username=form.username.data)
    
        with open("VanligePassord.txt") as f:
            for line in f:
                if form.password.data == line[:-1]:
                    flash("Passordet ditt er for svakt")
                else:
                    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)

您编写的检查在遇到错误密码时不会停止,它只会闪烁一条消息,然后继续下一个值。如果密码与错误值不匹配,它会转到 else 分支并立即提交,无论稍后是否匹配其他值。

使用any()检查是否有任何值与密码匹配,然后根据该值闪现错误或提交。

password = form.password.data

with current_app.open_resource("common_passwords.txt") as f:
    common_values = [line.rstrip("\n") for line in f]

if any(value == password for value in common_values):
    flash("Don't use a common password.")
else:
    user.set_password(password)
    db.session.add(user)
    db.session.commit()

由于您使用的是 WTForms,因此您也可以将其编写为表单验证的一部分,而不是视图的一部分。

class RegistrationForm(FlaskForm):
    ...

    def validate_password(self, field, data):
       with current_app.open_resource("common_passwords.txt") as f:
           common_values = [line.rstrip("\n") for line in f] 

       if any(value == data for value in common_values):
           raise ValidationError("Don't use a common password.")