【问题标题】:Why store sessions on the server instead of inside a cookie?为什么将会话存储在服务器上而不是在 cookie 中?
【发布时间】:2011-04-26 07:49:40
【问题描述】:

我使用 Flask 已经有一段时间了,我真的很喜欢这个框架。我不明白的一件事是,在几乎所有其他地方,他们都在谈论将会话存储在服务器上,并将会话 ID 存储在客户端上,然后才能识别会话。但是在使用烧瓶后,我觉得没有必要这样做。以加密方式将会话保存为客户端上的 cookie 符合我的目的,并且看起来也很安全。唯一的事情是我无法加密会话密钥,例如:

session['life'] = 'the great one'

会显示为

life='gfhjfkjdfa some encryption kj'

在客户端保存的cookie中。但是这有什么关系,因为它仍然是加密的。 我相信这里的人比我更了解事情,所以请有人澄清一下:-)

【问题讨论】:

    标签: python session cookies flask


    【解决方案1】:

    即使您的数据被加密,用户仍然可以将他们的 cookie 回滚到以前的状态(除非您开始编码一次性 ID 等)

    例如cookie 表示用户有 100 个积分,用户花费 100 个积分,他们得到一个新的 cookie,表示他们有 0 个积分。然后他们可以恢复之前的 cookie(100 积分)。

    根据您加密 cookie 的方式,用户还可以删除密钥、插入虚假数据等。

    【讨论】:

    • 谢谢尼克!但同样不会加密处理它。例如 session[credits]=100 将被保存为类似 credits='agfkalh some encryption agakh' 的东西。如果用于加密 cookie 的密钥对用户来说是未知的并且足够困难,他将如何进行任何更改。我的意思是他当然可以继续删除密钥并插入一些虚假数据,但只要他是无法解密cookie,怎么会出问题。
    • 如果100个credits被加密为credits="abc",用户可以看到这个,知道"abc"会被解密成100,不需要自己解密.所以他们可以花掉所有的学分,然后再次将学分设置为“abc”。有一些方法可以防止这种情况发生,但是当您可以将数据存储在服务器上时,真的不值得麻烦。
    • 谢谢! ..这实际上是我一直在寻找的东西,只是没想到..
    【解决方案2】:

    如果服务器需要会话数据,则将其存储在服务器上是有意义的。它降低了从客户端来回发送的数据量。此外,cookie 对它们可以存储的数据量有限制。

    【讨论】:

    • 谢谢内德!但在大多数情况下,数据量不会被忽略。
    • 但是,是的,+1,因为我认为这是一个正当的理由,我想我可以放心地在我的应用程序上忽略它:-)。但是仍在等待更多答案!
    • 是的,尽管您可能希望将数据存储在 cookie 中的一种情况是避免在呈现页面时访问数据库。例如,如果您有一个“嗨,内德!”页面上的问候语,否则您的页面是静态的,将其存储在 cookie 中比访问数据库(或 memcached 或 redis 之类的缓存)更可取
    【解决方案3】:

    除了上面已经提到的几点

    1. 用户可以使用浏览器设置禁用 cookie。 许多防病毒扫描程序也会扫描 cookie 并将其标记为风险,因此也可能导致用户计算机上不允许使用 cookie。

    2. 即使在会话进行中,用户也可以删除 Cookie。 (事实上​​,前几天我无意中这样做了,当时我的一台 PC 扫描列出了跟踪 cookie……我只是点击了“清理”,它们都不见了)。如果用户碰巧删除了 cookie,用户状态将丢失。

    如果您使用 cookie 来管理整个状态,您始终依赖于客户端环境及其设置。因此,您可能至少需要一个备用机制,以防 cookie 被删除/禁用等,以便您的应用程序正常工作。

    【讨论】:

    • 感谢 InSane 的回复,但这并不是我真正想知道的 :-)。我想知道为什么要在服务器上存储任何与会话相关的数据。我的意思是即使您将会话变量存储在服务器上,您也必须将会话 ID 存储在客户端上的 cookie 中。回答您所说的,通过删除 cookie,用户实际上对自己造成了更大的伤害,因为他失去了会议。如果他登录到该站点,他实际上可能会被注销,或者他甚至可能会丢失一些数据。就禁用 cookie 而言,我想必须处理后备。谢谢
    • @Alice - 实际上这就是我想要表达的意思。基本上,您需要将会话相关数据存储在服务器上,因为由于上述示例,将其存储在客户端上并不可靠。当 cookie 被禁用时,sessionid 通常作为它的一个值在查询字符串中传递。会话可以独立于 cookie - 即使是会话 id
    • “sessionid 通常作为它的一个值在查询字符串中传递”-是的,听起来不错..1 up...谢谢
    【解决方案4】:

    Flask 使用的 SecureCookie 实现不加密值。唯一要确保的是用户不能在不知道应用程序使用的秘密的情况下修改 cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2013-08-21
      • 2018-09-26
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      相关资源
      最近更新 更多