如果 Pyramid 会话被 one-way 散列且未存储 server-side,数据从何而来?

If Pyramid sessions are one-way hashed and not stored server-side, where is the data coming from?

使用 SignedCookieSessionFactory 时,文档指出使用了 sha512 HMAC 摘要算法。因此,一旦 session 数据被序列化,它就会被签名并发送到 session cookie 下的用户客户端。

Pyramid 的文档中没有提到 sessions 也被缓存 server-side(在这个 SessionFactory 下)。

这会产生矛盾,并且在与 SessionAuthenticationPolicy 配对时也会导致身份验证混乱。如果无法从客户端的 session cookie 中检索到 session 数据(因为它是 one-way 散列的),下面的内容怎么可能?

  1. 使用应用程序进行身份验证,这样读取 Request.authenticated_userid 不会 return None。

  2. session cookie 复制到剪贴板。

  3. 通过访问视图注销 forget(request) 中的 headers 在响应中 returned。

  4. 用复制的值替换 session cookie。

  5. 用户现在已重新登录。

我知道简单地删除 cookie client-side 不足以使 session 完全无效(没有黑名单),但这会带来以下问题:

最终,我想答案大概是这样的: "Maintain server-side sessions using an include such as pyramid_redis_sessions"

如有任何解释,我们将不胜感激。

cookie 包含所有数据。会话内容本身与该内容的 hmac 签名一起存储在 cookie 中。这意味着如果客户端足够努力,他们可能会查看内容,但他们无法更改它,因为如果没有服务器端秘密,他们将无法创建可信签名。

How is it possible to remain secure with browser-scoped sessions unless every session cookie the user has recently been issued is somehow remembered and blacklisted/invalidated?

这取决于您使用会话的目的 - 在将数据放入会话对象之前,您需要考虑这些问题。

Is it possible then to invalidate sessions server-side, a little more robust than just the headers=forget(request) pattern?

除非您在会话中存储某种 ID,然后在服务器端 table 列入黑名单的 ID。如果你这样做,那么你可以编写自己的包装器会话工厂来打开会话,检查 id,如果它被列入黑名单则返回一个空的。当然,您可能只想使用服务器端会话库,如 pyramid_redis_sessions 或 pyramid_beaker 及其服务器端存储后端之一。