如果Pyramid会话是单向散列而不是存储在服务器端,那么数据来自何处?

问题描述 投票:3回答:1

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

在Pyramid的文档中没有提到会话也在服务器端缓存(在此SessionFactory下)。

这提出了一个矛盾,并且当与SessionAuthenticationPolicy配对时也导致认证混乱。如果无法从客户端的session cookie中检索会话数据(因为它是单向散列),那么以下哪些是可能的呢?

  1. 使用应用程序进行身份验证,以便读取Request.authenticated_userid不会返回None。
  2. session cookie复制到剪贴板。
  3. 通过访问视图来注销,从而在响应中返回来自forget(request)的标头。
  4. 用复制的值替换session cookie。
  5. 用户现在重新登录。

我知道简单地删除cookie客户端不足以使会话完全无效(没有列入黑名单),但这会产生以下问题:

  • 除非用户最近发布的每个会话cookie以某种方式被记住并列入黑名单/无效,否则如何使用浏览器范围的会话保持安全?
  • session cookie实际上是用于在内存中查找会话的密钥/会话ID吗?由于它是单向签名,这肯定是唯一的解释?
  • 是否有可能使服务器端的会话无效,比headers=forget(request)模式更强大一点?

最终,我想答案是这样的:“使用pyramid_redis_sessions这样的包括维护服务器端会话”

任何解释将不胜感激。

python python-3.x pyramid
1个回答
2
投票

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

除非用户最近发布的每个会话cookie以某种方式被记住并列入黑名单/无效,否则如何使用浏览器范围的会话保持安全?

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

是否有可能使服务器端的会话无效,比仅仅为headers = forget(请求)模式更强大一些?

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

© www.soinside.com 2019 - 2024. All rights reserved.