2017-09-03 95 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。不要遵循令用戶煩惱的傳統指南。