2017-09-03 29 views
1

我在烧瓶中进行了以下登录。现在我想知道它是否安全。如果不是,我还需要添加什么才能提高成熟度。我知道像SSL这样的东西也很重要,但现在我只关心我能做些什么来使我的Flask代码更安全。我的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) 

回答

1

登录过程看起来很安全。

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

而且你应该要求一个最小的密码复杂度。 Danjgo默认会这样做,但passwordmeter包可以帮助您实现此目的。

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

+0

谢谢。我的会话是否安全?我是否需要添加属于flask_security的user_datastore以保护我的会话? – user3080315

+0

是的,这是一个很好的做法,可以使用像Flask-Security这样的众所周知的文档化基本插件,而不是重新发明轮子。 – glenfant

1
  • 它很容易受到account enumeration via timing attacks因为你只能做bcrypt时的用户名存在。当用户不存在时,您可以通过添加虚拟计算来修复它。不是一个大问题,但你至少应该知道它。

  • 虽然你在选择bcrypt方面做得很好,但我同意@glenfant至少应该在密码复杂性方面做些事情。不过,建议阅读NIST's new password guidelines。不要遵循令用户烦恼的传统指南。