Среднесвязь
В данном документе описываются все компоненты среднесвязи, поставляемые с 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для ответов, не являющихся потоковыми.
В более ранних версиях заголовок 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.
В более ранних версиях среднесвязь устанавливала заголовки 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_FILTERSECURE_CONTENT_TYPE_NOSNIFFSECURE_HSTS_INCLUDE_SUBDOMAINSSECURE_HSTS_PRELOADSECURE_HSTS_SECONDSSECURE_REDIRECT_EXEMPTSECURE_SSL_HOSTSECURE_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 мидлверов:
-
Его следует расположить в начале списка, если вы собираетесь включить перенаправление на HTTPS, так как это позволит избежать прохождения через множество других ненужных мидлверов.
-
Перед теми, которые изменяют заголовок
Vary(SessionMiddleware,GZipMiddleware,LocaleMiddleware). -
Перед любыми мидлверами, которые могут изменять или использовать тело ответа.
После
UpdateCacheMiddleware: Изменяет заголовокVary. -
Перед
CommonMiddleware: использует свой заголовокETagприUSE_ETAGS=True. -
После
UpdateCacheMiddleware: Изменяет заголовокVary. -
Один из верхних, после
SessionMiddleware(использует данные сеанса) иUpdateCacheMiddleware(изменяет заголовокVary). -
Перед любыми мидлверами, которые могут изменить ответ (он устанавливает заголовки
ETagиContent-Length). Мидлвер, который появляется передCommonMiddlewareи изменяет ответ, должен сбросить заголовки.После
GZipMiddleware, чтобы не рассчитывать заголовокETagдля сжатых содержимых.Близко к началу: перенаправляет, если
APPEND_SLASHилиPREPEND_WWWустановлены вTrue. -
Перед любыми мидлверами представления, которые предполагают, что атаки CSRF уже обработаны.
Он должен следовать за
SessionMiddlewareесли вы используетеCSRF_USE_SESSIONS. -
После
SessionMiddleware: использует хранилище сеанса. -
После
SessionMiddleware: может использовать хранилище, основанное на сеансе. -
После любого мидлвера, который изменяет заголовок
Vary: этот заголовок используется для выбора значения для ключа хэша кеша. -
Должен быть в конце, так как это мидлвер последней инстанции.
-
Должен быть в конце, так как это мидлвер последней инстанции.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/ref/middleware/