在 Django 中不循环会话密钥有什么风险?

What are the risks of not cycling session keys in Django?

Django 在登录时循环会话密钥。基本原理(我不明白)是 in this pull request:

When logging in, change the session key whilst preserving any existing sesssion. This means the user will see their session preserved across a login boundary, but somebody snooping the anonymous session key won't be able to view the authenticated session data.

如果您希望轻松地将未经授权的行为与后来登录的用户相关联,则循环使用会话密钥会很尴尬。 This answer 建议简单地禁用 cycle_key.

禁用 cycle_key 有哪些风险? (与上述评论或其他评论相关。)

编辑:好的,我想我明白上面的理由了。它的字面意思是,如果您窥探了未授权的操作,您将无法将它们与授权操作相关联。我可以看到这可能很好,但是 1) 理想情况下 unauth 和 auth 操作都受到保护(例如 https),2) 必须权衡安全利益与保留会话密钥的利益。

编辑 2:拉取请求来自 2008 年,当时的 https 格局大不相同。 Now it's >=90% https.

查看 cycle_keydocumentation 它说(强调我的):

Creates a new session key while retaining the current session data. django.contrib.auth.login() calls this method to mitigate against session fixation.

因此,会话密钥循环的原因是为了防止 session fixation attack [OWASP]。经过一些研究,会话固定攻击基本上是攻击者从服务器获取会话 ID(或使用任意会话 ID)并通过某种方式(XSS 攻击、MITM 攻击等)迫使其他用户使用此会话 ID 来向您的服务器进行身份验证。如果此处的服务器未更改会话密钥,攻击者现在可以接管用户会话并冒充他们。

因此禁用它是一个很大的风险,而禁用它的returns也很小。我会建议您(以及阅读本文的任何人)不要禁用此内置功能,事实上不要在没有仔细考虑的情况下禁用任何 Django 的安全功能。

关于将未经身份验证的行为与经过身份验证的行为相关联,最好通过在用户会话本身中序列化数据来存储数据,如 second method of this answer by Gonzalo 中所述。