如果 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 散列的),下面的内容怎么可能?
使用应用程序进行身份验证,这样读取 Request.authenticated_userid
不会 return None。
将 session
cookie 复制到剪贴板。
通过访问视图注销 forget(request)
中的 headers 在响应中 returned。
用复制的值替换 session
cookie。
用户现在已重新登录。
我知道简单地删除 cookie client-side 不足以使 session 完全无效(没有黑名单),但这会带来以下问题:
如何使用 browser-scoped session 保持安全,除非 每个 session cookie 用户都有最近发行的不知何故被记住了 blacklisted/invalidated?
session
cookie 实际上是一个 key/session ID,用于在内存中查找 session?因为它是 one-way 签名的,所以这肯定是唯一的解释吧?
是否有可能使 sessions server-side 无效,比 headers=forget(request)
模式更强大一点?
最终,我想答案大概是这样的:
"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 及其服务器端存储后端之一。
使用 SignedCookieSessionFactory
时,文档指出使用了 sha512 HMAC 摘要算法。因此,一旦 session 数据被序列化,它就会被签名并发送到 session
cookie 下的用户客户端。
Pyramid 的文档中没有提到 sessions 也被缓存 server-side(在这个 SessionFactory 下)。
这会产生矛盾,并且在与 SessionAuthenticationPolicy
配对时也会导致身份验证混乱。如果无法从客户端的 session
cookie 中检索到 session 数据(因为它是 one-way 散列的),下面的内容怎么可能?
使用应用程序进行身份验证,这样读取
Request.authenticated_userid
不会 return None。将
session
cookie 复制到剪贴板。通过访问视图注销
forget(request)
中的 headers 在响应中 returned。用复制的值替换
session
cookie。用户现在已重新登录。
我知道简单地删除 cookie client-side 不足以使 session 完全无效(没有黑名单),但这会带来以下问题:
如何使用 browser-scoped session 保持安全,除非 每个 session cookie 用户都有最近发行的不知何故被记住了 blacklisted/invalidated?
session
cookie 实际上是一个 key/session ID,用于在内存中查找 session?因为它是 one-way 签名的,所以这肯定是唯一的解释吧?是否有可能使 sessions server-side 无效,比
headers=forget(request)
模式更强大一点?
最终,我想答案大概是这样的:
"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 及其服务器端存储后端之一。