Python 如果金字塔会话是单向散列的,而不是存储在服务器端,那么数据来自哪里?

Python 如果金字塔会话是单向散列的,而不是存储在服务器端,那么数据来自哪里?,python,python-3.x,pyramid,Python,Python 3.x,Pyramid,使用SignedCookiesSessionFactory时,文档说明使用了sha512 HMAC摘要算法。因此,一旦序列化了会话数据,就会在会话cookie下对其进行签名并发送到用户的客户端 在Pyramid的文档中没有提到会话也缓存在服务器端(在此SessionFactory下) 这就产生了矛盾,并且在与SessionAuthenticationPolicy配对时也导致了身份验证混乱。如果无法从客户端的会话cookie中检索会话数据(因为它是单向散列的),那么如何能够实现以下操作 向应用程序

使用
SignedCookiesSessionFactory
时,文档说明使用了sha512 HMAC摘要算法。因此,一旦序列化了会话数据,就会在
会话
cookie下对其进行签名并发送到用户的客户端

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

这就产生了矛盾,并且在与
SessionAuthenticationPolicy
配对时也导致了身份验证混乱。如果无法从客户端的
会话
cookie中检索会话数据(因为它是单向散列的),那么如何能够实现以下操作

  • 向应用程序进行身份验证,以便读取
    请求。authenticated_userid
    不会返回None

  • 会话
    cookie复制到剪贴板

  • 通过访问一个视图进行注销,
    forget(request)
    中的标题将在响应中返回

  • 会话
    cookie替换为复制的值

  • 用户现在已重新登录

  • 我理解,简单地删除cookie客户端不足以使会话完全无效(没有黑名单),但这会带来以下问题:

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

    • 会话
      cookie实际上是用于在内存中查找会话的密钥/会话ID吗?因为它是单向签署的,这肯定是唯一的解释吗

    • 那么,是否有可能在服务器端使会话无效,这比仅使用
      headers=forget(request)
      模式要健壮一些

    最终,我认为答案大致如下: “使用包含来维护服务器端会话,例如
    金字塔\u redis\u会话


    任何解释都将不胜感激。

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

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

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

    那么,是否有可能在服务器端使会话无效,这比headers=forget(request)模式更健壮一些

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