gpt4 book ai didi

python - Flask session 不 JSON 序列化 cookie

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:01 26 4
gpt4 key购买 nike

我正在使用 Flask 的 session ,它在响应中设置一个签名的 cookie header 。

from flask import session

这会设置一个名为 session 的 cookie,a = 1

a = session.get('a', None)
session['a'] = 1
return jsonify(a = a)

代码中的jsonify只是为了表明下次请求时正在读取cookie,确实如此。这是对第二个请求的响应

{
"a": 1
}

我需要在客户端读取cookie。所以我希望它是 JSON 编码的。这是响应中的 Set-Cookie header

Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15mdREzhGWP1uc; HttpOnly; Path=/

它不是 JSON 序列化的。

Flask 版本为 0.10.1。从 0.10 版开始,它使用来自 itsdangerous 的 session 其主要优点是使用 JSON 序列化 cookie,而不是之前使用的 Pickle 序列化。

我错过了什么? Flask 版本为 0.10.1

最佳答案

您误解了默认 Flask session 实现的格式。 session对象生成加密签名的 JSON,然后(可选)压缩,然后进行 base64 编码以存储 session 值,确保客户端无法篡改存储在其中的值。在您的情况下,没有应用压缩(只有在减少最终输出大小的情况下才应用压缩)。

这是对以前使用 pickle 格式的更改限制攻击者在服务器端 secret 被泄露时可能造成的损害(请参阅 blog post of mine 为什么 pickle 可能是危险的)。

换句话说,Flask 所做的只是从 pickle 换出序列化器。为扩展的标记 JSON 格式,但保留了预先存在的加密签名和压缩。

因此这种格式不太适合在客户端再次解码(您必须解码 base64,可能需要解压缩数据,拆分签名,并且您可能需要解释额外的类型标记)。您可以为此切换 session 实现,但非常不推荐这样做。

如果你想与客户端共享数据,你可以将数据嵌入到页面中 <script>var session_data = {{data|tojson|safe}}; block ,或使用数据设置单独的 cookie。

关于python - Flask session 不 JSON 序列化 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com