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

20 августа 2014

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

reverse() может генерировать URL, указывающие на другие хосты

В определенных ситуациях обратный URL может генерировать URL, относящиеся к схеме (URL, начинающиеся с двух косых черт), которые могут неожиданно перенаправить пользователя на другой хост. Злоумышленник может воспользоваться этим, например, перенаправляя пользователей на фишинговый сайт, предназначенный для запроса паролей пользователей.

Чтобы исправить это, теперь обратное преобразование URL гарантирует, что ни один URL не начинается с двух косых черт (//), заменяя вторую косую черту на ее аналог в кодировке URL (%2F). Такой подход гарантирует, что семантика останется неизменной, при этом URL будет относиться к домену, а не к схеме.

Отказ в обслуживании при загрузке файлов

До этого релиза обработка загрузки файлов в Django в конфигурации по умолчанию могла деградировать, производя огромное количество системных вызовов os.stat(), когда загружалось дублирующееся имя файла. Поскольку stat() может вызывать IO, это может привести к огромному, зависящему от данных замедлению, которое медленно ухудшается со временем. В итоге, пользователь, имеющий возможность загружать файлы, может вызвать низкую производительность обработчика загрузки, что в конечном итоге приведет к тому, что он станет очень медленным, просто загружая файлы размером 0 байт. В этот момент даже медленное сетевое соединение и небольшое количество HTTP-запросов - это все, что необходимо, чтобы сделать сайт недоступным.

Мы исправили эту проблему, изменив алгоритм генерации имен файлов, если файл с загруженным именем уже существует. Storage.get_available_name() теперь добавляет знак подчеркивания плюс случайную 7-символьную буквенно-цифровую строку (например, "_x3a1gho"), а не итерацию через знак подчеркивания, за которым следует число (например, "_1", "_2" и т.д.).

RemoteUserMiddleware перехват сеанса

При использовании RemoteUserMiddleware и RemoteUserBackend изменение заголовка REMOTE_USER между запросами без промежуточного выхода из системы могло привести к тому, что сеанс предыдущего пользователя был перехвачен последующим пользователем. Теперь промежуточное ПО выводит пользователя из системы при неудачной попытке входа.

Утечка данных через манипуляцию строкой запроса в contrib.admin

В старых версиях Django можно было раскрыть данные любого поля, изменив параметры «popup» и «to_field» строки запроса на странице формы изменения администратора. Например, запрос URL вида /admin/auth/user/?_popup=1&t=password и просмотр HTML страницы позволял увидеть хэш пароля каждого пользователя. Хотя администратор требует, чтобы пользователи имели права на просмотр страниц формы изменения, это может привести к утечке данных, если вы полагаетесь на то, что пользователи имеют доступ к просмотру только определенных полей модели.

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

Исправления

  • Исправлена валидация электронной почты и URL-адресов, чтобы не учитывать завершающее тире (#22579).
  • Предотвращение индексов на виртуальных полях PostgreSQL (#22514).
  • Предотвращен крайний случай, когда значения полей FK могут быть инициализированы неверным значением, когда создается набор форм инлайн-модели для отношения, определенного для указания на поле, отличное от PK (#13794).
  • Восстановлены сигналы pre_delete для удаления каскада GenericRelation (#22998).
  • Исправлена обработка транзакций при указании базы данных не по умолчанию в createcachetable и flush (#23089).
  • Исправлены ошибки «ORA-01843: not a valid month» при использовании Unicode в старых версиях сервера Oracle (#20292).
  • Восстановлено исправление ошибки при отправке электронной почты в Unicode с Python 2.6.5 и ниже (#19107).
  • Предотвращение UnicodeDecodeError в runserver с неUTF-8 и неанглийской локалью (#23265).
  • Исправлены ошибки JavaScript при редактировании многогеометрических объектов в виджете OpenLayers (#23137, #23293).
  • Предотвращение сбоя на Python 3 при использовании строк запросов, содержащих некодированные не-ASCII символы (#22996).
Вернуться на верх