Flask-Login:防止 cookie 重用缺陷

Dep*_*ado 4 python cookies flask flask-login

当一位朋友告诉我我的网站上存在安全漏洞时,我正在使用 Flask 开发一个 Web 应用程序。事实上,如果他转储浏览器在登录、注销时拥有的 cookie,然后粘贴回相同的 cookie,就好像他从未注销过一样。事实是,这不是预期的行为。当用户注销时,cookie应该失效并且不能再次使用。

现在我有一个用户模型,存储在数据库中。在这种情况下应该使用什么技术?以前有人遇到过同样的问题吗?更重要的是,如何在我的网站上集成这种安全性,而不必重写每个视图来检查令牌或类似的东西?

这是应用程序初始化。

# App initialization
app = Flask(__name__)
app.config.from_object('config')
app.wsgi_app = ProxyFix(app.wsgi_app)

# Database Setup
db = SQLAlchemy(app)

# Login Manager Setup
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'index'
login_manager.session_protection = 'strong'
Run Code Online (Sandbox Code Playgroud)

这是我目前使用的用户模型。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(54))
    superuser = db.Column(db.Boolean())
    active = db.Column(db.Boolean())
    register_date = db.Column(db.DateTime())
    last_login = db.Column(db.DateTime())
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了与此问题无关的方法和附加字段。

rep*_*cus 5

原因是flask-login接受请求中的会话 cookie,因为它实际上是一个有效的会话 cookie,即使在用户删除它然后再次发送它之后也是如此。我同意,它不应该这样做,但确实如此。如果用户更改密码,实际上也会发生同样的事情,旧的 cookie 仍然有效,因为Flask-login 的默认行为是不使用会话 cookie 中的用户密码。这里有一篇很好的文章。

简而言之,使用@login_manager.token_loader和 加载由基于用户密码哈希的加密签名密钥创建的会话令牌。这实际上是 Flask-login 所建议的,正如这里所讨论的。您可以用于werkzeug.itsdangerous.URLSafeTimedSerializer加载/创建令牌。

Flask-login 的文档应该更清楚地反映这种行为,否则只是强制使用更强的令牌作为默认行为。