Flask – 具有相同名称的多个会话 cookie

Posted

技术标签:

【中文标题】Flask – 具有相同名称的多个会话 cookie【英文标题】:Flask – multiple session cookies with the same name 【发布时间】:2020-08-17 16:41:56 【问题描述】:

我在我的 Flask 应用程序中发现了一个非常奇怪的问题。我发现在某些情况下,可以使用相同的名称创建多个会话 cookie。我附上了一张关于它的图片。它不是特定于浏览器的。

这本身很奇怪,但真正的问题是当我尝试使用CSRF 令牌验证表单时。不幸的是,Flask 选择了错误的会话 cookie,并且 CSRF 令牌的验证无法成功。更奇怪的是,即使提交了多个表单,问题仍然存在。唯一的解决方案是删除普通用户无法选择的 cookie。

是否有任何选项可以阻止 Flask 创建具有相同名称的 cookie? 或者至少有一个选项可以从我的应用程序中获取所有 cookie 名称?在这种情况下,至少我可以删除具有相同名称的会话 cookie。

【问题讨论】:

在你的截图中添加标题,这样更容易看到问题 您如何在生产环境中运行您的应用程序,使用 WSGI 层还是使用内置的 Flask 开发服务器?当开发服务器在调试模式下运行时,它会启动第二个实例来监视更改,我可以看到这可能会导致生产中的问题,因为该服务器实际上是单请求的,并且可能会跨越值。你能用你的堆栈详细信息更新帖子吗? 项目正在开发中。有几次我用 gunicorn (gunicorn -c gunicorn_config.py --bind 127.0.0.1:5070 wsgi:app) 运行它,但大多数时候我使用 Flask 开发服务器: FLASK_APP=server.py FLASK_ENV=development flask run --port 5070 我猜是什么导致了这个问题:提交表单时有一个并行的 AJAX 请求。我修复了这个错误,现在我的“问题”是我无法重现这种不寻常的行为。 如何故意创建具有相同名称的会话 cookie 也是一个很好的问题?我的意思是来自应用程序而不是某种 cookie 编辑器。我以前从未见过这样的事情。 没有标头和/或 cookie 上下文,很难确定发生了什么。 Cookie 之间有何不同? 【参考方案1】:

没有代码,很难分辨Flask在哪里生成了多个同名的cookie,但是有可能你让cookie存活的时间很长,请看Flask: How to remove cookies?处理这个问题。

如果我理解正确,另一个主要问题是 [comment by me]:

Flask 选择了一个错误的会话 cookie [多个同名的]

从多个具有相同名称的 cookie 中选择错误的 cookie 不是特定于 Flask 的,而是关于客户端/浏览器使用的逻辑,参见例如How to handle multiple cookies with the same name?

【讨论】:

以上是关于Flask – 具有相同名称的多个会话 cookie的主要内容,如果未能解决你的问题,请参考以下文章

在Flask和Flask-Login中删除会话cookie

删除 Worklight Adapter 中的 Cookie:多个会话使用基于相同适配器的身份验证

在同一域中具有多个 Laravel 实例时的会话/cookie 错误

如何重命名 servicestack 中的默认会话 cookie 名称

Flask - 像使用 cookie 一样将会话数据保存在数据库中

Python Flask:跟踪用户会话?如何获取会话 Cookie ID?