Примечания к выпуску Django 1.7.9

8 июля 2015

Django 1.7.9 исправляет несколько проблем безопасности и ошибок в 1.7.8.

Возможность отказа в обслуживании путем заполнения хранилища сеансов

В предыдущих версиях Django сессионные бэкенды создавали новую пустую запись в хранилище сессий при каждом обращении к request.session и наличии сеансового ключа, предоставленного в cookies запроса, в котором еще не было сеансовой записи. Это могло позволить злоумышленнику легко создать множество новых записей сессии, просто посылая повторные запросы с неизвестными ключами сессии, потенциально заполняя хранилище сессий или вызывая вытеснение записей сессии других пользователей.

Встроенные бэкенды сессий теперь создают запись сессии только в том случае, если сессия действительно изменена; пустые записи сессий не создаются. Таким образом, потенциальный DoS теперь возможен только в том случае, если сайт решит открыть представление, изменяющее сеанс, для анонимных пользователей.

Поскольку каждый встроенный бэкенд сессий был исправлен отдельно (вместо исправления в основном фреймворке сессий), сопровождающие сторонних бэкендов сессий должны проверить, присутствует ли такая же уязвимость в их бэкенде, и исправить ее, если это так.

Возможность инъекции заголовка, поскольку валидаторы принимают новые строки во входных данных

Некоторые встроенные валидаторы Django (EmailValidator, наиболее серьезные) не запрещали символы новой строки (из-за использования $ вместо \Z в регулярных выражениях). Если вы используете значения с новой строкой в заголовках HTTP-ответов или электронной почты, вы можете пострадать от атак инъекции заголовков. Сам Django не уязвим, поскольку HttpResponse и утилиты отправки почты в django.core.mail запрещают новые строки в HTTP и SMTP заголовках, соответственно. Хотя валидаторы были исправлены в Django, если вы создаете HTTP-ответы или почтовые сообщения другими способами, будет хорошей идеей убедиться, что эти методы также запрещают новые строки. Вы также можете проверить, что все существующие данные в вашем приложении не содержат неожиданных новых строк.

validate_ipv4_address(), validate_slug() и URLValidator также затронуты, однако, начиная с Django 1.6, поля форм GenericIPAddresseField, IPAddressField, SlugField и URLField, использующие эти валидаторы, обрезают вводимые данные, поэтому возможность попадания новых строк в ваши данные существует только в том случае, если вы используете эти валидаторы вне полей форм.

Недокументированная, внутренне неиспользуемая функция validate_integer() теперь более строгая, поскольку она проверяет правильность значения с помощью регулярного выражения, а не просто приводит значение с помощью int() и проверяет, не возникло ли исключение.

Исправления

  • Предотвращена потеря свойств столбцов null/not null при переименовании полей в базах данных MySQL (#24817).
  • Исправлено SimpleTestCase.assertRaisesMessage() на Python 2.7.10 (#24903).
Вернуться на верх