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

20 августа 2014 г.

Django 1.5.9 исправляет несколько проблем безопасности в 1.5.8.

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

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

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

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

До этого выпуска передача файлов в Django в конфигурации по умолчанию могла привести к возникновению огромного количества os.stat() системных вызовов при загрузке повторяющегося имени файла. Поскольку stat() может вызывать ввод-вывод, это может привести к огромному замедлению, зависящему от данных, которое со временем постепенно ухудшается. Конечный результат состоит в том, что при наличии достаточного количества времени пользователь, имеющий возможность загружать файлы, может снизить производительность обработчика загрузки, что в конечном итоге приведет к его очень медленной загрузке просто из-за загрузки 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/?pop=1&t=password и просмотр HTML-кода страницы позволил просмотреть хеш-пароль каждого пользователя. Хотя администратор требует, чтобы пользователи в первую очередь имели разрешения на просмотр страниц формы изменения, это может привести к утечке данных, если вы полагаетесь на пользователей, имеющих доступ для просмотра только определенных полей в модели.

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

Copyright ©2021 All rights reserved