当我的一个朋友告诉我网站上存在安全漏洞时,我正在用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'
这是我当前使用的用户模型。
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())
请注意,我删除了与该问题无关的方法和附加字段。
原因是flask-login
接受请求中的会话cookie,因为它实际上是有效的会话cookie,即使在用户删除它然后再次发送它之后也是如此。我同意,它不应该那样做,但是可以。如果用户更改了密码,则实际上会发生同样的事情,旧的cookie仍然有效,因为flask-login的默认行为是不使用会话cookie中的用户passwd。这是一个很好的写起来就在这里。
简而言之,请使用@login_manager.token_loader
和并根据用户passwd的哈希值加载由加密签名密钥创建的会话令牌。这就是烧瓶登录实际建议,为讨论在这里。您可以werkzeug.itsdangerous.URLSafeTimedSerializer
用来加载/创建令牌。
flask-login的文档应该确实更清楚地反映此行为,或者只是强制使用更强的令牌作为默认行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句