Примечания к выпуску 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). - Разрешение не-ASCII значений для
ForeignKey.related_nameна Python 3 путем исправления ложного срабатывания системной проверки (#25016). - Исправлены инлайн-формы, использующие родительский объект, имеющий первичный ключ
UUIDField, и дочерний объект, имеющий первичный ключAutoField(#24958). - Исправлена ошибка в фильтре шаблона
unordered_listна определенных входах (#25031). - Исправлена регрессия в
URLValidator, которая делала недействительными ДВУ с Punycode (#25059). - Улучшен опрос
pyinotifyrunserver(#23882).