使用flask安全登录

时间:2019-03-15 15:32:55

标签: python security session flask

我正在开发一个需要用户登录的Flask应用程序。当前有两个用户,一个是admin,另一个是正常。此刻,我正在使用会话来存储用户的用户名,然后检查他们拥有的用户名,然后根据用户名允许或禁止他们访问页面。

这是我的代码:

from flask import Flask, session, redirect, render_template, request


app = Flask(__name__)
app.config["SECRET_KEY"] = <byte string generated by os.urandom(24)>
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(hours=1)


@app.route("/")
def login_redirect():
    if check_login(session, False):
        return redirect("/interface")
    return redirect("/login")


@app.route("/login", methods=["POST", "GET"])
def login():
    error = ""
    if request.method == "POST":
        username = request.form["username"]
        password = request.form["password"]
        if check_password(username, password):
            session["username"] = request.form["username"]
            return redirect("/register")
        error = "Invalid username or password"
    return render_template("login.html", theme_colour=theme_colour, error=error)


def check_password(username, password):
    ph = PasswordHasher()
    db_hash, salt = database.retrieve_pw_salt(username)  # returns hashed/salted password and salt from database
    if db_hash is None:
        return False  # invalid username
    try:
        ph.verify(db_hash, salt + password)
        return True  # valid username and password
    except exceptions.VerifyMismatchError:
        return False  # invalid password


def check_login(session, requires_elevated):
    if "username" not in session:
        return False
    elif session["username"] == "admin":
        return True
    elif session["username"] == "normal" and not requires_elevated:
        return True
    return False


@app.before_request
def setup():
    session.permanent = True  # will now abide by 1 hour timeout setting

但是,最近引起我注意的是,这可能不是很安全。老实说,我对自己不是很确定,所以我想知道是否有人可以向我解释任何漏洞,以及我将如何改进安全性。

谢谢。

1 个答案:

答案 0 :(得分:0)

使用会话数据来授权权限并不安全,因为可以通过窃取会话cookie来劫持会话,这将使攻击者对给定的用户帐户产生不适当的影响。由于您使用的是Flask,因此建议您使用Flask-Login来管理会话。这将使您能够区分新登录和非新登录,以使敏感信息无法通过简单的会话劫持来访问和操纵。

您还可以考虑通过Google,Facebook,LinkedIn或其他一些主要提供商实施第三方身份验证,以便您可以部分外包与提供密码和用户名存储相关的繁重工作。双因素身份验证是提高应用程序安全性的另一种方法,它发送带有唯一代码的文本供个人使用或其他一些因素进行登录。我已经链接到底部的flask-login文档。

注意:我会给您代码示例,但是您问了一个非常笼统的问题,即如何从基于会话的授权中提高安全性。我建议您检查这些文档,尝试为应用程序的安全性编写更好的解决方案,然后如果遇到任何问题,请发布另一个更具体的问题,即收到的逻辑或语法错误。祝你好运!

https://flask-login.readthedocs.io/en/latest/