Cuando un usuario envía el formulario de registro a Flask, quiero verificar la contraseña que eligió en un archivo con 10000 contraseñas comunes. Si su contraseña coincide con un valor común, quiero mostrar un mensaje en lugar de crear el usuario.
Escribí el código a continuación, pero siempre crea el usuario incluso si ingresa una de las contraseñas comunes. ¿Qué tiene de malo el cheque que escribí?
@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)El cheque que escribió no se detiene cuando encuentra una contraseña incorrecta, solo muestra un mensaje y luego continúa con el siguiente valor. Y si la contraseña no coincide con el valor incorrecto, va a la rama else y se confirma de inmediato, independientemente de si algún otro valor coincidiera más tarde.
Use any() para verificar si algún valor coincide con la contraseña, luego muestre un error o confirme en función de eso.
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()Dado que está utilizando WTForms, también puede escribir esto como parte de la validación del formulario en lugar de como parte de la vista.
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.")