我的Flask登录安全吗?

时间:2017-09-03 13:20:45

标签: python security session flask flask-sqlalchemy

我在Flask中进行了以下登录。现在我想知道它是否安全。如果不是我必须添加什么来增强成熟度。我知道像SSL这样的东西也很重要但是现在我只对我能做些什么来让我的Flask代码更安全感兴趣。

#Login
@app.route('/', methods=['GET', 'POST'])
def index():
    form = LoginForm()

    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user:
            if bcrypt.check_password_hash(user.password, form.password.data):
                login_user(user)
                return redirect(url_for('dashboard'))

        return render_template('login.html', form=form, ermsg="Invalid credentials")

    return render_template('login.html', form=form)

#Sign up
@app.route('/signup', methods=['GET', 'POST'])
def signup():
    form = RegisterForm()

    if form.validate_on_submit():
        pw_hash = bcrypt.generate_password_hash(form.password.data, 12)
        new_user = User(username=form.username.data, email=form.email.data, password=pw_hash)
        db.session.add(new_user)
        db.session.commit()

        return render_template('login.html', form=form, sumsg="User created!")

    return render_template('signup.html', form=form)

2 个答案:

答案 0 :(得分:1)

登录过程似乎很安全。

但您没有检查注册表单或现有电子邮件地址中潜在的现有用户。除非这是由基础User架构管理的。

您应该要求最小的密码复杂性。 Danjgo默认执行此操作,但passwordmeter包可以帮助您实现此目的。

https://pypi.python.org/pypi/passwordmeter

答案 1 :(得分:1)

  • 它容易受account enumeration via timing attacks攻击,因为您只在用户名存在时执行bcrypt。您可以通过在用户不存在时添加虚拟计算来修复它。这不是一个重大问题,但你至少应该意识到这一点。

  • 虽然您在选择bcrypt时做得很好,但我同意@glenfant至少应该使用密码复杂性。但是,建议您阅读NIST's new password guidelines。不要遵循惹恼用户的传统指南。