Релиз Django 1.4.3

10 декабря 2012

Патч Django 1.4.3 направлен на исправление двух ошибок безопасности в предыдущих версиях ветки 1.4.

Имейте в виду, что этот релиз безопасности немного отличается от предыдущих. Обе ошибки были исправлены в предыдущих обновлениях Django. В одном случае мы получили постоянные сообщения о проблемах, а в другом мы решили предпринять дальнейшие шаги, чтобы обновить код Django в ответ на кучу сообщений о потенциальных проблемах из различных источников.

Опасный заголовок Host

В прошлом релизе безопасности рассматривался вопрос об обработке заголовка Host у HTTP-запроса, в результате чего злоумышленник мог сгенерировать URL на свой сервер.

В ответ на всё поступающие сообщения об ошибках мы решили ввести дополнительные ограничения на проверку заголовка Host. Вместо того, чтобы пытаться приспособить все возможности HTTP проверка Host в Django пытается поддерживать меньше, но гораздо более общее подмножество:

  • Hostnames must consist of characters [A-Za-z0-9] plus hyphen (‘-‘) or dot (‘.’).
  • IP адреса – как IPv4, так и IPv6 – разрешены.

  • Порт, если указан, является числом.

В других случаях будет вызываться исключение django.core.exceptions.SuspiciousOperation.

Опасный редирект

В дополнение к предыдущей проблеме: в июле мы внесли некоторые изменения в классы, отвечающие за HTTP редирект, которые выполняют дополнительную проверку URL. Это коснулось как внутренних механизмов, так и сторонних, которые используют общий шаблон перенаправлений.

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

1. A new utility function, django.utils.http.is_safe_url, is added; this function takes a URL and a hostname, and checks that the URL is either relative, or if absolute matches the supplied hostname. This function is intended for use whenever user-supplied redirect targets are accepted, to ensure that such redirects cannot lead to arbitrary third-party sites.

2. All of Django’s own built-in views – primarily in the authentication system – which allow user-supplied redirect targets now use is_safe_url to validate the supplied URL.