在 Django 中不循环会话密钥有啥风险?
Posted
技术标签:
【中文标题】在 Django 中不循环会话密钥有啥风险?【英文标题】:What are the risks of not cycling session keys in Django?在 Django 中不循环会话密钥有什么风险? 【发布时间】:2021-11-27 19:53:29 【问题描述】:Django 在登录时循环会话密钥。理由(我不明白)是in this pull request:
登录时,更改会话密钥,同时保留任何现有的 会话。这意味着用户将在登录时看到他们的会话保留 边界,但窥探匿名会话密钥的人将无法查看 经过身份验证的会话数据。
如果您希望轻松地将未授权行为与后来登录的用户关联起来,那么循环会话密钥会很麻烦。 This answer 建议简单地禁用 cycle_key。
禁用cycle_key有什么风险? (与上面的评论或其他评论有关。)
编辑:好的,我想我理解上面的理由。它的字面意思是,如果你窥探了 unauth 操作,你将无法将它们与 auth 操作相关联。我可以看到这可能很好,但是 1) 理想情况下,unauth 和 auth 操作都受到保护(例如,https),2) 必须权衡安全利益与保留会话密钥的利益。
编辑 2:拉取请求是从 2008 年开始的,当时 https 的格局大不相同。 Now it's >=90% https.
【问题讨论】:
【参考方案1】:查看documentation 的cycle_key
它说(强调我的):
在保留当前会话数据的同时创建新会话密钥。 django.contrib.auth.login() 调用此方法来缓解会话固定。
因此,循环会话密钥的原因是为了防止session fixation attack [OWASP]。经过一些研究,会话固定攻击基本上是攻击者从服务器获取会话 ID(或使用任意 ID)并通过某种方式(XSS 攻击、MITM 攻击等)迫使其他用户使用此会话 ID对您的服务器进行身份验证。如果服务器没有更改会话密钥,攻击者现在可以接管用户会话并冒充他们。
因此禁用它是一个很大的风险,禁用它的回报也很小。我建议你(以及任何阅读本文的人)不要禁用这个内置功能,事实上不要在没有好好考虑的情况下禁用任何 Django 的安全功能。
关于将未经身份验证的行为与经过身份验证的行为相关联,最好通过在用户会话本身中序列化数据来存储数据,如second method of this answer by Gonzalo 中所述。
【讨论】:
感谢您的详尽回答。非常有帮助。我接受。但是,我对“禁用的好处很低”提出异议。我想要的具体好处是将 unauth 会话与登录的帐户关联(在内部)。为此,我需要使用会话密钥作为 id。 “序列化其他信息”方法没有用。 我可能不得不研究“每当有人登录时,将他们的旧会话 ID 与表中的用户帐户相关联,然后以某种方式加入它”。这实际上是相当尴尬的。身份是一个巨大的好处。破碎、老套、联合身份是一个很大的痛苦。 明确一点:由于我们允许许多 unauth 活动,因此 unauth 帐户积累了足够的状态,以至于将其全部保留在会话中是很脆弱的。我们将它存储在数据库中,以会话 ID 为键,当用户登录时,我们希望将所有状态与用户相关联。我知道那里可能存在安全问题,但这就是我们需要拥有丰富的非身份验证经验。 此外,***说,“大多数会话固定攻击都是基于 Web 的,并且大多数依赖于从 URL(查询字符串)或 POST 数据中接受的会话标识符。”我相信 Django 默认使用 cookie(我们也是)。我提供了如此多的细节,因为真正评估成本和收益可能需要权衡所有这些。以上是关于在 Django 中不循环会话密钥有啥风险?的主要内容,如果未能解决你的问题,请参考以下文章