我在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)
答案 0 :(得分:1)
登录过程似乎很安全。
但您没有检查注册表单或现有电子邮件地址中潜在的现有用户。除非这是由基础User
架构管理的。
您应该要求最小的密码复杂性。 Danjgo默认执行此操作,但passwordmeter
包可以帮助您实现此目的。
答案 1 :(得分:1)
它容易受account enumeration via timing attacks攻击,因为您只在用户名存在时执行bcrypt。您可以通过在用户不存在时添加虚拟计算来修复它。这不是一个重大问题,但你至少应该意识到这一点。
虽然您在选择bcrypt时做得很好,但我同意@glenfant至少应该使用密码复杂性。但是,建议您阅读NIST's new password guidelines。不要遵循惹恼用户的传统指南。