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

8 июля 2015

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

Кроме того, django.utils.deprecation.RemovedInDjango20Warning был переименован в RemovedInDjango110Warning, так как дорожная карта версий была изменена на 1.9, 1.10, 1.11 (LTS), 2.0 (исключена поддержка Python 2). Для обратной совместимости RemovedInDjango20Warning остается в качестве импортируемого псевдонима.

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

В предыдущих версиях 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() и проверяет, не возникло ли исключение.

Возможность отказа в обслуживании при проверке URL-адресов

URLValidator включало регулярное выражение, которое очень медленно оценивалось при определенных недействительных входных данных. Это регулярное выражение было упрощено и оптимизировано.

Исправления

  • Исправлено BaseRangeField.prepare_value() для использования метода base_field каждого prepare_value() (#24841).
  • Исправлено падение во время makemigrations, если модуль миграций либо отсутствует __init__.py, либо является файлом (#24848).
  • Исправлено QuerySet.exists(), возвращающее неверные результаты после аннотации с Count() (#24835).
  • Исправлено HStoreField.has_changed() (#24844).
  • Отменена оптимизация контекстного процессора шаблона CSRF, которая приводила к регрессии (#24836).
  • Исправлена ошибка, из-за которой контекстные процессоры шаблонов перезаписывали переменные, установленные в RequestContext после его создания (#24847).
  • Предотвращена потеря свойств столбцов null/not null при переименовании полей в базах данных MySQL (#24817).
  • Исправлена ошибка при использовании обратного отношения один-к-одному в ModelAdmin.list_display (#24851).
  • Исправлено цитирование SQL при переименовании поля в AutoField в PostgreSQL (#24892).
  • Исправлено отсутствие уникального ограничения при изменении поля с primary_key=True на unique=True (#24893).
  • Исправлено пикирование кверисетов при использовании prefetch_related() после удаления объектов (#24831).
  • Разрешено использовать choices дольше 1 дня с DurationField (#24897).
  • Исправлена ошибка при загрузке скомканных миграций из двух приложений с зависимостью между ними, когда замененные миграции зависимого приложения применялись частично (#24895).
  • Исправлена запись статуса «Применяется» для скомканных (замещающих) миграций (#24628).
  • Исправлены аннотации queryset при использовании выражений Case с exclude() (#24833).
  • Исправлено продвижение join для нескольких выражений Case. Аннотирование запроса несколькими выражениями Case могло неожиданно отфильтровать результаты (#24924).
  • Исправлено использование преобразований в подзапросах (#24744).
  • Исправлено SimpleTestCase.assertRaisesMessage() на Python 2.7.10 (#24903).
  • Обеспечена лучшая обратная совместимость для аргумента verbosity в командах управления optparse путем приведения его к целому числу (#24769).
  • Исправлено prefetch_related() на базах данных, отличных от PostgreSQL, для моделей, использующих первичные ключи UUID (#24912).
  • Исправлено удаление ограничений unique_together на MySQL (#24972).
  • Исправлена ошибка при загрузке изображений с MIME-типами, которые Pillow не определяет, например, bitmap, в forms.ImageField (#24948).
  • Исправлена регрессия при удалении модели через админку, имеющей GenericRelation с related_query_name (#24940).
  • Разрешение неаскриптивных значений для ForeignKey.related_name на Python 3 путем исправления ложного срабатывания системной проверки (#25016).
  • Исправлены инлайн-формы, использующие родительский объект, имеющий первичный ключ UUIDField, и дочерний объект, имеющий первичный ключ AutoField (#24958).
  • Исправлена ошибка в фильтре шаблона unordered_list на некоторых входах (#25031).
  • Исправлена ошибка в URLValidator, которая делала недействительными ДВУ Punycode (#25059).
  • Улучшен опрос pyinotify runserver (#23882).
Вернуться на верх