gpt4 book ai didi

Django 签名 cookie session 存储、重放攻击和 SESSION_COOKIE_AGE

转载 作者:行者123 更新时间:2023-12-01 03:08:01 25 4
gpt4 key购买 nike

根据 the Django documentation , 签名的 cookie session 存储容易受到重放攻击:

Note also that while the MAC can guarantee the authenticity of the data (that it was generated by your site, and not someone else), and the integrity of the data (that it is all there and correct), it cannot guarantee freshness i.e. that you are being sent back the last thing you sent to the client. This means that for some uses of session data, the cookie backend might open you up to replay attacks. Unlike other session backends which keep a server-side record of each session and invalidate it when a user logs out, cookie-based sessions are not invalidated when a user logs out. Thus if an attacker steals a user’s cookie, they can use that cookie to login as that user even if the user logs out. Cookies will only be detected as ‘stale’ if they are older than your SESSION_COOKIE_AGE.



这是否意味着:
  • 我们依靠客户端的 cookie 过期来确保 session 数据被破坏(因此,如果在浏览器删除 cookie 之前捕获 cookie 内容,仍然可能发生重放攻击),或
  • 服务器检测数据的陈旧性(与 SESSION_COOKIE_AGE 相比,并明确拒绝它认为陈旧的数据。

  • 从技术上讲,Django 能够确定 session 的“旧”程度而无需在服务器端持久保存该数据似乎是可行的,但文档似乎不清楚这是否正在完成,或者 Django 是否依赖/信任用户的浏览器杀死旧的 cookie(因此如果数据在过期之前被捕获, session 仍然可以重播)。

    最佳答案

    Django,通过 SessionMiddleware , 确实设置了 HTTP cookie expirationSESSION_COOKIE_AGE .这会告诉浏览器cookie什么时候应该被认为“太旧”和过期。这是很好的家政服务。此外,如果浏览器检测到不应再使用 cookie,它将不会使用它,这使 Django 不必花时间检查无论如何都不能使用的 cookie。

    但是, Django 不依赖浏览器来确保过期的 cookie 永远无法再次使用 .流氓代理可以获取 cookie 的副本,然后在过期日期之后重新使用它。 Django 通过将 cookie 发送到格式如下的浏览器来防止这种情况:

    <payload>:<creation stamp>:<signature>

    冒号是出现在数据中的分隔符。 <payload>是实际的 session 数据。 <creation stamp>是创建 cookie 时添加的时间戳, <signature>是对有效负载和创建标记进行签名的 MAC 签名。

    相关代码见 django.core.signing .文件顶部的注释为您提供了使用 Signer 的基本签名方案。类(class)。这个类不知道时间戳。但是,在签署 cookie 时,Django 使用 TimestampSigner ,它确实知道时间戳并产生我上面显示的格式。

    TimestampSigner unsigns一个 cookie,它会检查时间戳并在它太旧时引发异常:
    def unsign(self, value, max_age=None):
    """
    Retrieve original value and check it wasn't signed more
    than max_age seconds ago.
    """
    result = super().unsign(value)
    value, timestamp = result.rsplit(self.sep, 1)
    timestamp = baseconv.base62.decode(timestamp)
    if max_age is not None:
    if isinstance(max_age, datetime.timedelta):
    max_age = max_age.total_seconds()
    # Check timestamp is not older than max_age
    age = time.time() - timestamp
    if age > max_age:
    raise SignatureExpired(
    'Signature age %s > %s seconds' % (age, max_age))
    return value

    关于Django 签名 cookie session 存储、重放攻击和 SESSION_COOKIE_AGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54819263/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com