Spec-Zone.ru › Django 2.0

Среднесвязь

В данном документе описываются все компоненты среднесвязи, поставляемые с Django. Сведения о том, как их использовать и как создавать собственные компоненты среднесвязи, см. в руководстве по использованию среднесвязи.

Доступные компоненты среднесвязи

Среднесвязь кэширования

class UpdateCacheMiddleware [source]
class FetchFromCacheMiddleware [source]

Включить кэширование для всего сайта. Если они включены, каждая страница, работающая на Django, будет кэшироваться на срок, определённый настройкой CACHE_MIDDLEWARE_SECONDS. См. документацию по кэшированию.

Среднесвязь общего назначения

class CommonMiddleware [source]

Добавляет несколько удобств для перфекционистов:

  • Запрещает доступ к пользовательским агентам, указанным в настройке DISALLOWED_USER_AGENTS, которая должна быть списком скомпилированных объектов регулярных выражений.
  • Выполняет перенаправление URL на основе настроек APPEND_SLASH и PREPEND_WWW.

    Если APPEND_SLASH установлено в True, и исходный URL не заканчивается слешем, и он не найден в URLconf, то формируется новый URL, добавляя слеш в конец. Если этот новый URL найден в URLconf, то Django перенаправляет запрос на этот новый URL. В противном случае исходный URL обрабатывается обычным образом.

    Например, foo.com/bar будет перенаправлен на foo.com/bar/, если у вас нет корректной схемы URL для foo.com/bar, но есть корректная схема для foo.com/bar/.

    Если PREPEND_WWW установлено в True, URL без префикса "www." будут перенаправлены на тот же URL с префиксом "www.".

    Обе эти опции предназначены для нормализации URL. Философия заключается в том, что каждый URL должен существовать в одном и только одном месте. Технически URL foo.com/bar отличается от foo.com/bar/ — индексатор поисковой системы будет рассматривать их как отдельные URL — поэтому лучшей практикой является нормализация URL.

  • Обрабатывает ETags на основе настройки USE_ETAGS. Если USE_ETAGS установлено в True, Django рассчитает ETag для каждого запроса, хешировав содержимое страницы с помощью MD5, и будет обрабатывать ответы Not Modified, если это необходимо.
  • Устанавливает заголовок Content-Length для ответов, не являющихся потоковыми.
Изменено в Django 1.11:

В более ранних версиях заголовок Content-Length не устанавливался.

Устарело начиная с версии 1.11: Настройка USE_ETAGS устарела. Вместо неё следует использовать ConditionalGetMiddleware для обработки ETag.

CommonMiddleware.response_redirect_class

По умолчанию HttpResponsePermanentRedirect. Подкласс CommonMiddleware и переопределение атрибута позволит настроить перенаправления, выполняемые среднесвязью.

class BrokenLinkEmailsMiddleware [source]
  • Отправляет электронные письма о нерабочих ссылках на адреса MANAGERS (см. отчёт об ошибках).

Среднесвязь GZip

class GZipMiddleware [source]

Предупреждение

Недавно исследователи в области безопасности выявили, что при использовании методов сжатия (включая GZipMiddleware) на веб-сайте, сайт может стать уязвимым к ряду возможных атак. Перед использованием GZipMiddleware на вашем сайте, следует очень тщательно оценить, подвержены ли вы этим атакам. Если у вас есть любые сомнения в том, что вы затронуты, следует воздержаться от использования GZipMiddleware. Более подробная информация приведена в документе BREACH (PDF) и на сайте breachattack.com.

Сжимает содержимое для браузеров, поддерживающих сжатие GZip (все современные браузеры).

Этот компонент среднесвязи должен быть размещён до любого другого компонента, которому требуется читать или записывать тело ответа, чтобы сжатие выполнялось в последнюю очередь.

Он не будет сжимать содержимое, если выполняются следующие условия:

  • Тело содержимого меньше 200 байтов.
  • Для ответа уже установлен заголовок Content-Encoding.
  • Запрос (браузер) не отправил заголовок Accept-Encoding, содержащий gzip.

Если у ответа есть заголовок ETag, ETag делается слабым для соответствия RFC 7232#section-2.1.

Вы можете применить сжатие GZip к отдельным представлениям, используя декоратор gzip_page().

Среднесвязь условного получения

class ConditionalGetMiddleware [source]

Обрабатывает операции условного получения. Если у ответа нет заголовка ETag, среднесвязь добавляет его, если необходимо. Если у ответа есть заголовок ETag или Last-Modified, а у запроса есть If-None-Match или If-Modified-Since, ответ заменяется на HttpResponseNotModified.

Изменено в Django 1.11:

В более ранних версиях среднесвязь устанавливала заголовки Content-Length и Date и не устанавливала заголовок ETag.

Среднесвязь локализации

class LocaleMiddleware [source]

Включает выбор языка на основе данных из запроса. Настраивает содержимое для каждого пользователя. См. документацию по интернационализации.

LocaleMiddleware.response_redirect_class

По умолчанию HttpResponseRedirect. Подкласс LocaleMiddleware и переопределение атрибута позволит настроить перенаправления, выполняемые среднесвязью.

Среднесвязь сообщений

class MessageMiddleware [source]

Включает поддержку сообщений на основе cookie и сессии. См. документацию по сообщениям.

Среднесвязь безопасности

Предупреждение

Если позволяет ваша среда развертывания, обычно рекомендуется использовать фронтенд веб-сервер для выполнения функций, предоставляемых SecurityMiddleware. Таким образом, если запросы, которые не обслуживаются Django (такие как статические медиафайлы или загруженные пользователем файлы), будут иметь те же защитные механизмы, что и запросы к вашему приложению Django.

class SecurityMiddleware [source]

django.middleware.security.SecurityMiddleware предоставляет ряд улучшений безопасности для цикла запрос/ответ. Каждый из них может быть независимо включён или выключен с помощью настройки.

  • SECURE_BROWSER_XSS_FILTER
  • SECURE_CONTENT_TYPE_NOSNIFF
  • SECURE_HSTS_INCLUDE_SUBDOMAINS
  • SECURE_HSTS_PRELOAD
  • SECURE_HSTS_SECONDS
  • SECURE_REDIRECT_EXEMPT
  • SECURE_SSL_HOST
  • SECURE_SSL_REDIRECT

Строгая политика безопасности транспортного уровня HTTP

Для сайтов, которые должны быть доступны только по протоколу HTTPS, вы можете настроить современные браузеры, чтобы они отказывались от подключения к вашему доменному имени через небезопасное соединение (в течение заданного периода времени), установив заголовок “Strict-Transport-Security”. Это снижает вашу уязвимость к некоторым атакам типа «человек посередине» (MITM), которые подменяют SSL.

SecurityMiddleware установит этот заголовок для всех ответов HTTPS, если вы установите значение параметра SECURE_HSTS_SECONDS на ненулевое целое число.

При включении HSTS рекомендуется сначала использовать небольшое значение для тестирования, например, SECURE_HSTS_SECONDS = 3600 для одного часа. Каждый раз, когда веб-браузер видит заголовок HSTS с вашего сайта, он откажется от связи с вашим доменом по небезопасному протоколу (используя HTTP) на указанный период времени. После подтверждения, что все ресурсы на вашем сайте обслуживаются по безопасному протоколу (т. е. HSTS не нарушил ничего), рекомендуется увеличить это значение, чтобы защитить случайных посетителей (31536000 секунд, т. е. 1 год, является распространённым значением).

Кроме того, если вы установите значение параметра SECURE_HSTS_INCLUDE_SUBDOMAINS на True, SecurityMiddleware добавит директиву includeSubDomains к заголовку Strict-Transport-Security. Это рекомендуется (при условии, что все поддомены обслуживаются исключительно с помощью HTTPS), в противном случае ваш сайт может остаться уязвимым через небезопасное подключение к поддомену.

Если вы хотите добавить свой сайт в список предварительной загрузки браузера browser preload list, установите значение параметра SECURE_HSTS_PRELOAD на True. Это добавит директиву preload к заголовку Strict-Transport-Security.

Предупреждение

Политика HSTS применяется ко всему вашему домену, а не только к URL-адресу ответа, на котором вы установили заголовок. Поэтому вы должны использовать ее только в том случае, если весь ваш домен обслуживается только через HTTPS.

Браузеры, должным образом соблюдающие заголовок HSTS, откажутся от возможности пользователей пропустить предупреждения и подключиться к сайту с истекшим, самоподписанным или иным образом недействительным сертификатом SSL. Если вы используете HSTS, убедитесь, что ваши сертификаты в хорошем состоянии и остаются таковыми!

Примечание

Если вы развернуты за балансировщиком нагрузки или прокси-сервером обратного проксирования, и заголовок Strict-Transport-Security не добавляется в ваши ответы, это может быть потому, что Django не понимает, что находится на защищённом соединении; возможно, вам нужно установить значение параметра SECURE_PROXY_SSL_HEADER.

X-Content-Type-Options: nosniff

Некоторые браузеры пытаются угадать типы содержимого загружаемых ресурсов, перезаписывая заголовок Content-Type. Хотя это может помочь отображать сайты с неправильно настроенными серверами, это также может представлять собой угрозу безопасности.

Если ваш сайт обслуживает загруженные пользователем файлы, злоумышленник может загрузить специально подготовленный файл, который браузер интерпретирует как HTML или JavaScript, когда вы ожидали чего-то безобидного.

Чтобы предотвратить угадывание браузером типа содержимого и заставить его всегда использовать тип, указанный в заголовке Content-Type, вы можете передать заголовок X-Content-Type-Options: nosniff. SecurityMiddleware сделает это для всех ответов, если значение параметра SECURE_CONTENT_TYPE_NOSNIFF равно True.

Обратите внимание, что в большинстве случаев развертывания, где Django не участвует в предоставлении файлов, загруженных пользователем, этот параметр вам не поможет. Например, если ваш MEDIA_URL обслуживается непосредственно вашим веб-сервером (nginx, Apache и т. д.), то вы должны установить этот заголовок там. С другой стороны, если вы используете Django для чего-то, например, для проверки авторизации при загрузке файлов, и не можете установить заголовок с помощью веб-сервера, этот параметр будет полезен.

X-XSS-Protection: 1; mode=block

Некоторые браузеры имеют возможность блокировать содержимое, которое выглядит как атака XSS. Они работают, отслеживая JavaScript-содержимое в параметрах GET или POST страницы. Если JavaScript воспроизводится в ответе сервера, отображение страницы блокируется, и вместо этого отображается страница ошибки.

Для управления работой фильтра XSS используется заголовок X-XSS-Protection.

Для включения фильтра XSS в браузере и принудительного блокирования подозреваемых атак XSS вы можете передать заголовок X-XSS-Protection: 1; mode=block . SecurityMiddleware сделает это для всех ответов, если значение параметра SECURE_BROWSER_XSS_FILTER равно True.

Предупреждение

Фильтр XSS в браузере является полезной мерой защиты, но не должен использоваться в качестве единственного средства. Он не может обнаруживать все атаки XSS, и не все браузеры поддерживают заголовок. Убедитесь, что вы по-прежнему проверяете и очищаете все входные данные, чтобы предотвратить атаки XSS.

Переадресация SSL

Если ваш сайт поддерживает как HTTP, так и HTTPS соединения, большинство пользователей по умолчанию будут подключаться через небезопасное соединение. Для максимальной безопасности вы должны перенаправлять все HTTP-соединения на HTTPS.

Если вы установите значение параметра SECURE_SSL_REDIRECT на True, SecurityMiddleware постоянно (HTTP 301) перенаправит все HTTP-соединения на HTTPS.

Примечание

По соображениям производительности, предпочтительнее выполнять эти перенаправления вне Django, в балансировщике нагрузки или прокси-сервере обратного проксирования, например, nginx. SECURE_SSL_REDIRECT предназначен для случаев развертывания, когда это не является возможным.

Если значение параметра SECURE_SSL_HOST имеет значение, все перенаправления будут отправлены на этот хост вместо первоначально запрошенного хоста.

Если на вашем сайте есть несколько страниц, которые должны быть доступны по протоколу HTTP и не перенаправляться на HTTPS, вы можете указать регулярные выражения для сопоставления этих URL-адресов в параметре SECURE_REDIRECT_EXEMPT.

Примечание

Если вы развернуты за балансировщиком нагрузки или прокси-сервером обратного проксирования и Django не может определить, является ли запрос уже защищенным, вам может потребоваться установить значение параметра SECURE_PROXY_SSL_HEADER.

Средства обработки сессий

class SessionMiddleware [source]

Включает поддержку сессий. См. документацию по сессиям.

Средства обработки сайтов

class CurrentSiteMiddleware [source]

Добавляет атрибут site, представляющий текущий сайт, к каждому входящему объекту HttpRequest. См. документацию по сайтам.

Средства обработки аутентификации

class AuthenticationMiddleware

Добавляет атрибут user, представляющий текущего пользователя, вошедшего в систему, к каждому входящему объекту HttpRequest. См. Аутентификация в веб-запросах.

class RemoteUserMiddleware

Средство обработки для использования аутентификации, предоставляемой веб-сервером. См. Аутентификация с использованием REMOTE_USER для получения подробностей об использовании.

class PersistentRemoteUserMiddleware

Средство обработки для использования аутентификации, предоставляемой веб-сервером, при включении только на странице входа. См. Использование REMOTE_USER только на страницах входа для получения подробностей об использовании.

Средства обработки защиты от CSRF

class CsrfViewMiddleware [source]

Добавляет защиту от межсайтовых поддельных запросов (CSRF), добавляя скрытые поля в формы POST и проверяя запросы на правильное значение. Смотрите документацию по защите от межсайтовых поддельных запросов (CSRF).

X-Frame-Options средний

class XFrameOptionsMiddleware [source]

Простая защита от кликджекинга через заголовок X-Frame-Options.

Порядок подключения мидлверов

Вот некоторые советы по порядку подключения различных классов Django мидлверов:

  1. SecurityMiddleware

    Его следует расположить в начале списка, если вы собираетесь включить перенаправление на HTTPS, так как это позволит избежать прохождения через множество других ненужных мидлверов.

  2. UpdateCacheMiddleware

    Перед теми, которые изменяют заголовок Vary (SessionMiddleware, GZipMiddleware, LocaleMiddleware).

  3. GZipMiddleware

    Перед любыми мидлверами, которые могут изменять или использовать тело ответа.

    После UpdateCacheMiddleware: Изменяет заголовок Vary.

  4. ConditionalGetMiddleware

    Перед CommonMiddleware: использует свой заголовок ETag при USE_ETAGS = True.

  5. SessionMiddleware

    После UpdateCacheMiddleware: Изменяет заголовок Vary.

  6. LocaleMiddleware

    Один из верхних, после SessionMiddleware (использует данные сеанса) и UpdateCacheMiddleware (изменяет заголовок Vary).

  7. CommonMiddleware

    Перед любыми мидлверами, которые могут изменить ответ (он устанавливает заголовки ETag и Content-Length). Мидлвер, который появляется перед CommonMiddleware и изменяет ответ, должен сбросить заголовки.

    После GZipMiddleware, чтобы не рассчитывать заголовок ETag для сжатых содержимых.

    Близко к началу: перенаправляет, если APPEND_SLASH или PREPEND_WWW установлены в True.

  8. CsrfViewMiddleware

    Перед любыми мидлверами представления, которые предполагают, что атаки CSRF уже обработаны.

    Он должен следовать за SessionMiddleware если вы используете CSRF_USE_SESSIONS.

  9. AuthenticationMiddleware

    После SessionMiddleware: использует хранилище сеанса.

  10. MessageMiddleware

    После SessionMiddleware: может использовать хранилище, основанное на сеансе.

  11. FetchFromCacheMiddleware

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

  12. FlatpageFallbackMiddleware

    Должен быть в конце, так как это мидлвер последней инстанции.

  13. RedirectFallbackMiddleware

    Должен быть в конце, так как это мидлвер последней инстанции.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/ref/middleware/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API