【问题标题】:Check the size of Flask's session cookie检查 Flask 会话 cookie 的大小
【发布时间】:2021-06-03 11:37:21
【问题描述】:

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

【问题讨论】:

    标签: python flask session cookies session-cookies


    【解决方案1】:

    如果序列化 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 对象的大小。

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多