Python Flask会话不会JSON序列化cookie

Python Flask会话不会JSON序列化cookie,python,session,cookies,flask,python-2.6,Python,Session,Cookies,Flask,Python 2.6,我正在使用Flask的会话,它在响应中设置一个签名cookie头 from flask import session 这将设置一个名为a=1的cookie会话 代码中的jsonify只是为了显示cookie在下一个请求中被读取,并且它是。这是对第二个请求的响应 { "a": 1 } 我需要在客户端读取cookie。所以我希望它是JSON编码的。这是响应中的Set Cookie头 Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15md

我正在使用Flask的会话,它在响应中设置一个签名cookie头

from flask import session
这将设置一个名为a=1的cookie会话

代码中的jsonify只是为了显示cookie在下一个请求中被读取,并且它是。这是对第二个请求的响应

{
  "a": 1
}
我需要在客户端读取cookie。所以我希望它是JSON编码的。这是响应中的Set Cookie头

Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15mdREzhGWP1uc; HttpOnly; Path=/
它不是JSON序列化的

烧瓶版本为0.10.1。从版本0.10开始,它使用会话,会话的主要优点是JSON序列化cookies,而不是以前使用的Pickle序列化


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

您误解了默认Flask会话实现的格式。session对象生成加密签名的JSON,然后对其进行选择性压缩,然后对其进行base64编码以存储会话值,确保客户端不能篡改其中存储的值。在您的情况下,未应用任何压缩仅当这减少了最终输出大小时才应用压缩

这是对以前使用pickle的格式的更改,以限制攻击者在服务器端机密被泄露时所能造成的伤害。请参阅为什么pickle可能是危险的

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

因此,这种格式实际上不适合在客户端再次解码,您必须解码base64,可能需要解压缩数据,拆分签名,还可能需要解释额外的类型标记。您可以为此切换会话实现,但这是非常不推荐的


如果您想与客户端共享数据,您可以将数据嵌入到带有var session_data={{data | tojson | safe}}的块中的页面中;,或者使用数据设置一个单独的cookie。

您误解了默认Flask会话实现的格式。session对象生成加密签名的JSON,然后对其进行选择性压缩,然后对其进行base64编码以存储会话值,确保客户端不能篡改其中存储的值。在您的情况下,未应用任何压缩仅当这减少了最终输出大小时才应用压缩

这是对以前使用pickle的格式的更改,以限制攻击者在服务器端机密被泄露时所能造成的伤害。请参阅为什么pickle可能是危险的

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

因此,这种格式实际上不适合在客户端再次解码,您必须解码base64,可能需要解压缩数据,拆分签名,还可能需要解释额外的类型标记。您可以为此切换会话实现,但这是非常不推荐的


如果您想与客户端共享数据,您可以将数据嵌入到带有var session_data={{data | tojson | safe}}的块中的页面中;,或者用数据设置一个单独的cookie。

@ClodoaldoNeto:删除了关于jsonify的部分;其余的仍然存在。@MartijnPieters为什么flask建议密钥只用于对数据进行签名,而不用于加密:这意味着用户可以查看cookie的内容,但不能修改它,除非他们知道用于签名的密钥?这是文档中的错误、最近的更改还是我误解了什么?@max:这个答案确实有误导性,我会更新它。cookie经过加密签名和压缩。@max:updated;在此特定情况下,仅应用base64编码;该值中有一个{a:1}JSON文档,后跟一个\x00空字节和签名。@ClodoaldoNeto:删除了关于jsonify的部分;其余的仍然存在。@MartijnPieters为什么flask建议密钥只用于对数据进行签名,而不用于加密:这意味着用户可以查看cookie的内容,但不能修改它,除非他们知道用于签名的密钥?这是文档中的错误、最近的更改还是我误解了什么?@max:这个答案确实有误导性,我会更新它。cookie经过加密签名和压缩。@max:updated;在此特定情况下,仅应用base64编码;该值中有一个{a:1}JSON文档,后跟一个\x00空字节和签名。
Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15mdREzhGWP1uc; HttpOnly; Path=/