【发布时间】:2021-06-03 11:37:21
【问题描述】:
我正在使用 Flask 的默认安全 cookie 会话。我已经看到 cookie 的大小限制是 4KB。如何检查 Flask 会话 cookie 的大小?
【问题讨论】:
标签: python flask session cookies session-cookies
我正在使用 Flask 的默认安全 cookie 会话。我已经看到 cookie 的大小限制是 4KB。如何检查 Flask 会话 cookie 的大小?
【问题讨论】:
标签: python flask session cookies session-cookies
如果序列化 cookie 值太大(> 4093 字节),Werkzeug 在生成 set-cookie 标头时已显示详细警告。
用户警告:“会话”cookie 太大:值为 4050 字节,但标头需要 50 个额外字节。最终大小为 4100 字节,但限制为 4093 字节。浏览器可能会默默地忽略比这更大的 cookie。
这只是一个警告,因为我们实际上并不知道任何给定浏览器会接受什么,4093 只是几年前常用的最低值。 (What is the maximum size of a web browser's cookie's key?)
如果您在会话 cookie 中存储超过 4k 的数据,您可能需要重新评估存储数据的方式,而不是尝试添加大小检查。 4k cookie 意味着每次请求和响应都会发送 4k 的数据。例如,您可能想从数据库或Store large data or a service connection per Flask session 中检索数据,在这种情况下,您只需在会话中存储一个 id 即可获取数据。
如果您真的想以编程方式检查 cookie 的大小,可以从 response.headers 获取它们,并检查它们的长度。 Flask 仅在返回响应之前序列化会话 cookie,但您可以手动触发,以便 cookie 值可用。
from flask.globals import _request_ctx_stack
@app.after_request()
def error_for_large_cookie(response):
ctx = _request_ctx_stack.top
app.session_interface.save_session(app, ctx, response)
for value in response.headers.getlist("Set-Cookie", as_bytes=True):
if len(value) >= 4093:
raise ValueError("Cookie too large.")
如果包含会话的任何 cookie 太大,这将导致 500 错误(并在终端中显示回溯)。或者把警告变成错误,效果一样但代码更少:
import warnings
warnings.filterwarnings("error", r".* cookie is too large", module=r"werkzeug\.http")
在 Python 中使用 sys.getsizeof() 递归检查 session dict 的大小没有用,因为重要的是序列化 cookie 标头的大小,而不是 Python 对象的大小。
【讨论】: