Примечания к выпуску 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).