首页 > 解决方案 > 检查 Flask 会话 cookie 的大小

问题描述

我正在使用 Flask 的默认安全 cookie 会话。我已经看到 cookie 的大小限制是 4KB。如何检查 Flask 会话 cookie 的大小?

标签: pythonflasksessioncookiessession-cookies

解决方案


set-cookie如果序列化的 cookie 值太大(> 4093 字节),Werkzeug 在生成标头时已经显示了详细的警告。

用户警告:“会话”cookie 太大:值为 4050 字节,但标头需要 50 个额外字节。最终大小为 4100 字节,但限制为 4093 字节。浏览器可能会默默地忽略比这更大的 cookie。

这只是一个警告,因为我们实际上并不知道任何给定的浏览器会接受什么,4093 只是几年前常用的最低值。(网络浏览器的 cookie 密钥的最大大小是多少?

如果您在会话 cookie 中存储超过 4k 的数据,您可能想要重新评估存储数据的方式,而不是尝试添加大小检查。4k cookie 意味着每次请求和响应都会发送 4k 的数据。例如,您可能想从数据库中检索数据,或者存储大数据或每个 Flask 会话的服务连接,在这种情况下,您需要在会话中存储的只是一个 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")

用递归方式检查sessionPython 中 dict的大小sys.getsizeof()没有用,因为重要的是序列化的 cookie 标头的大小,而不是 Python 对象的大小。


推荐阅读