我正在开发一个需要用户登录的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
但是,最近引起我注意的是,这可能不是很安全。老实说,我对自己不是很确定,所以我想知道是否有人可以向我解释任何漏洞,以及我将如何改进安全性。
谢谢。
答案 0 :(得分:0)
使用会话数据来授权权限并不安全,因为可以通过窃取会话cookie来劫持会话,这将使攻击者对给定的用户帐户产生不适当的影响。由于您使用的是Flask,因此建议您使用Flask-Login来管理会话。这将使您能够区分新登录和非新登录,以使敏感信息无法通过简单的会话劫持来访问和操纵。
您还可以考虑通过Google,Facebook,LinkedIn或其他一些主要提供商实施第三方身份验证,以便您可以部分外包与提供密码和用户名存储相关的繁重工作。双因素身份验证是提高应用程序安全性的另一种方法,它发送带有唯一代码的文本供个人使用或其他一些因素进行登录。我已经链接到底部的flask-login文档。
注意:我会给您代码示例,但是您问了一个非常笼统的问题,即如何从基于会话的授权中提高安全性。我建议您检查这些文档,尝试为应用程序的安全性编写更好的解决方案,然后如果遇到任何问题,请发布另一个更具体的问题,即收到的逻辑或语法错误。祝你好运!