Flask-Login:防止cookie重用缺陷

时间:2015-02-17 08:35:56

标签: python cookies flask flask-login

当朋友告诉我网站上有安全漏洞时,我正在使用Flask开发一个webapp。实际上,如果他在登录时丢弃了他的浏览器所拥有的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'

以下是我目前使用的用户模型。

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())

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

2 个答案:

答案 0 :(得分:4)

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

简而言之,使用@login_manager.token_loader并根据用户passwd的哈希加载由加密签名密钥创建的会话令牌。这就是flask-login实际推荐的内容,如here所述。您可以使用werkzeug.itsdangerous.URLSafeTimedSerializer加载/创建令牌。

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

答案 1 :(得分:0)

您可以将Flask-Login上的安全级别设置为" strong" - 这会增加对会话有效性的额外检查,如果找到标识符不匹配,则删除整个会话。

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

会话保护

login_manager.session_protection = "strong"