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)
请注意,我删除了与此问题无关的方法和附加字段。
原因是flask-login接受请求中的会话 cookie,因为它实际上是一个有效的会话 cookie,即使在用户删除它然后再次发送它之后也是如此。我同意,它不应该这样做,但确实如此。如果用户更改密码,实际上也会发生同样的事情,旧的 cookie 仍然有效,因为Flask-login 的默认行为是不使用会话 cookie 中的用户密码。这里有一篇很好的文章。
简而言之,使用@login_manager.token_loader和 加载由基于用户密码哈希的加密签名密钥创建的会话令牌。这实际上是 Flask-login 所建议的,正如这里所讨论的。您可以用于werkzeug.itsdangerous.URLSafeTimedSerializer加载/创建令牌。
Flask-login 的文档应该更清楚地反映这种行为,否则只是强制使用更强的令牌作为默认行为。
| 归档时间: |
|
| 查看次数: |
1867 次 |
| 最近记录: |