Django подписал хранилище файлов cookie сеанса, атаки воспроизведения и SESSION_COOKIE_AGE - PullRequest
0 голосов
/ 22 февраля 2019

Согласно документации Django , хранилище подписанных файлов cookie уязвимо для атаки воспроизведения:

Обратите также внимание, что хотя MAC может гарантировать подлинность данных (чтоон был сгенерирован вашим сайтом, а не кем-то другим), и целостность данных (что они все там и правильно), это не может гарантировать свежесть, т. е. то, что вы отправляете обратно последнее, что вы отправили клиенту.Это означает, что для некоторых видов использования данных сеанса бэкэнд cookie может открыть вас для повторных атак.В отличие от других бэкэндов сессий, которые хранят записи каждого сеанса на стороне сервера и делают ее недействительной, когда пользователь выходит из системы, сеансы на основе файлов cookie не становятся недействительными, когда пользователь выходит из системы.Таким образом, если злоумышленник похитит куки-файл пользователя, он может использовать этот куки-файл для входа в систему как этот пользователь, даже если он вышел из системы.Куки будут обнаружены как «устаревшие», только если они старше, чем ваш SESSION_COOKIE_AGE.

Означает ли это, что:

  1. Мы полагаемся на истечение срока действия на стороне клиентакуки, чтобы гарантировать, что данные сеанса уничтожены (таким образом, атака воспроизведения все еще возможна, если содержимое куки захвачено до удаления куки браузером), или
  2. Сервер обнаруживает устаревание данных (сравниваяс SESSION_COOKIE_AGE и явно отклоняет данные, которые он считает устаревшими.

Технически возможно, что Django сможет определить, насколько «старым» является сеанс без сохранения этой стороны данных, ноДокументы, кажется, не ясны о том, выполняется ли это или нет, или Django полагается / доверяет браузеру пользователя, чтобы убить старые куки (и, таким образом, сеанс все еще может быть воспроизведен, если данные были захвачены до его истечения).

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Django, через SessionMiddleware, устанавливает срок действия cookie HTTP на SESSION_COOKIE_AGE.Это сообщает браузеру, когда cookie следует считать «слишком старым» и срок его действия истек.Это хорошая уборка.Кроме того, если браузер обнаружит, что cookie-файл больше не должен использоваться, он не будет его использовать, и это избавит Django от необходимости тратить время на изучение cookie-файла. в любом случае .

Тем не менее, Django не полагается на браузеры, чтобы гарантировать, что просроченные куки больше никогда не смогут использоваться .Мошеннический агент может получить копию файла cookie, а затем повторно использовать его после истечения срока его действия.Django предотвращает это, отправляя cookie в браузер в следующем формате:

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

Двоеточия - это разделители, которые появляются буквально в данных.<payload> - фактические данные сеанса.<creation stamp> - это отметка времени, добавленная при создании файла cookie, а <signature> - это подпись MAC, которая подписывает полезную нагрузку и отметку о создании.

Соответствующий код можно увидеть в django.core.signing.В комментариях вверху файла приведены основные сценарии подписи с использованием класса Signer.Этот класс не знает о отметках времени.Однако при подписании файлов 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
0 голосов
/ 23 февраля 2019

Короче говоря, вам нужно установить довольно короткую SESSION_COOKIE_AGE, чтобы злоумышленники не могли использовать ваш сайт.

Это, вероятно, реализовано следующим образом:

  1. Данные cookie хранят отметку времени, когда был выпущен файл cookie
  2. Когда файл cookie читается на стороне сервера, он получает эту отметку времени и сравнивает ее с SESSION_COOKIE_AGE.
  3. Еслиотметка времени файла cookie старше SESSION_COOKIE_AGE, запрос отклоняется
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...