Примечания к выпуску Django 1.1.4¶
Добро пожаловать в Django 1.1.4!
Это четвертый выпуск «исправлений ошибок» в серии Django 1.1, улучшающий стабильность и производительность кодовой базы Django 1.1.
За одним исключением, Django 1.1.4 сохраняет обратную совместимость с Django 1.1.3. Он также содержит ряд исправлений и других улучшений. Django 1.1.4 является рекомендуемым обновлением для любой разработки или развертывания, использующей или нацеленной на Django 1.1.
Полную информацию о новых возможностях, обратной несовместимости и устаревших возможностях в ветке 1.1 смотрите в Примечания к выпуску Django 1.1.
Обратные несовместимые изменения¶
Исключение CSRF для запросов AJAX¶
Django включает механизм CSRF-защиты, который использует токен, вставляемый в исходящие формы. Затем промежуточное программное обеспечение проверяет наличие маркера при отправке формы и проверяет его.
До версии Django 1.2.5 наша защита CSRF делала исключение для AJAX-запросов на следующей основе:
- Многие наборы инструментов AJAX добавляют заголовок X-Requested-With при использовании XMLHttpRequest.
- Браузеры имеют строгую политику одинакового происхождения в отношении XMLHttpRequest.
- В контексте браузера единственный способ добавить пользовательский заголовок такого рода - это XMLHttpRequest.
Поэтому для простоты использования мы не применяли проверки CSRF к запросам, которые казались AJAX на основе заголовка X-Requested-With. Веб-фреймворк Ruby on Rails имеет аналогичное исключение.
Недавно инженеры Google ознакомили членов команды разработчиков Ruby on Rails с комбинацией плагинов для браузеров и перенаправлений, которые могут позволить злоумышленнику предоставить пользовательские HTTP-заголовки в запросе к любому сайту. Это может позволить поддельному запросу выглядеть как запрос AJAX, тем самым преодолевая защиту CSRF, которая доверяет одноименной природе запросов AJAX.
Майкл Козиарски из команды Rails обратил на это наше внимание, и мы смогли создать концепцию, демонстрирующую ту же уязвимость в обработке CSRF в Django.
Чтобы исправить это, Django теперь будет применять полную проверку CSRF ко всем запросам, независимо от очевидного происхождения AJAX. Технически это обратно несовместимо, но риски безопасности были признаны перевешивающими проблемы совместимости в данном случае.
Кроме того, Django теперь будет принимать CSRF-токен в пользовательском HTTP-заголовке X-CSRFTOKEN, а также в самой форме отправки, для удобства использования с популярными инструментами JavaScript, которые позволяют вставлять пользовательские заголовки во все AJAX-запросы.
Пожалуйста, посмотрите CSRF docs for example jQuery code, который демонстрирует эту технику, убедившись, что вы смотрите документацию для вашей версии Django, поскольку точный необходимый код отличается для некоторых старых версий Django.