Примечания к выпуску Django 1.1.4¶
Добро пожаловать в Джанго 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 к запросам, которые на основе заголовка X-Requested-With выглядели как AJAX. Веб-фреймворк 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, например, код jQuery <csrf-ajax>, который демонстрирует этот метод. Убедитесь, что вы просматриваете документацию для вашей версии Django, поскольку точный необходимый код отличается для некоторых старых версий Django.