Среднесвязь
В данном документе описываются все компоненты среднесвязи, которые поставляются с Django. Информацию о том, как их использовать и как написать собственную среднесвязь, см. в руководстве по использованию среднесвязи.
Доступная среднесвязь
Среднесвязь кэша
-
class UpdateCacheMiddleware
-
class FetchFromCacheMiddleware
Включите кэширование по всему сайту. Если эти компоненты включены, каждая страница, работающая на Django, будет кэшироваться в течение времени, определённого настройкой CACHE_MIDDLEWARE_SECONDS. См. документацию по кэшированию.
Среднесвязь «Общие»
-
class CommonMiddleware
Добавляет несколько удобств для перфекционистов:
- Запрещает доступ к пользовательским агентам, указанным в настройке
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. - Устанавливает заголовок
Content-Lengthдля ответов, не являющихся потоковыми.
-
CommonMiddleware.response_redirect_class
По умолчанию используется HttpResponsePermanentRedirect. Подклассируйте CommonMiddleware и переопределите атрибут для настройки перенаправлений, выполняемых среднесвязью.
-
class BrokenLinkEmailsMiddleware
- Отправляет уведомления по электронной почте о неработающих ссылках адресатам в настройке
MANAGERS(см. Обработку ошибок).
Среднесвязь GZip
-
class GZipMiddleware
Предупреждение
Недавно исследователи в области безопасности выявили, что при использовании методов сжатия (включая GZipMiddleware) на веб-сайте сайт может стать уязвимым к ряду возможных атак. Перед использованием GZipMiddleware на вашем сайте тщательно оцените, подвержены ли вы этим атакам. Если вы любым образом сомневаетесь, что подвержены, то следует отказаться от использования GZipMiddleware. Дополнительную информацию см. в документе BREACH (PDF) и на сайте breachattack.com.
Среднесвязь django.middleware.gzip.GZipMiddleware сжимает контент для браузеров, поддерживающих сжатие GZip (все современные браузеры).
Эта среднесвязь должна быть размещена перед любой другой среднесвязью, которая нуждается в чтении или записи тела ответа, чтобы сжатие происходило после этого.
Она НЕ будет сжимать контент, если выполнены следующие условия:
- Тело контента меньше 200 байт.
- Ответ уже установил заголовок
Content-Encoding. - Запрос (браузер) не отправил заголовок
Accept-Encoding, содержащийgzip.
Если ответ имеет заголовок ETag , то ETag делается слабым, чтобы соответствовать RFC 7232#section-2.1.
Вы можете применить сжатие GZip к отдельным представлениям, используя декоратор gzip_page().
Среднесвязь условного получения
-
class ConditionalGetMiddleware
Обрабатывает условные операции GET. Если ответ не содержит заголовок ETag , среднесвязь добавляет его при необходимости. Если ответ содержит заголовок ETag или Last-Modified , а запрос содержит If-None-Match или If-Modified-Since , ответ заменяется на HttpResponseNotModified.
Среднесвязь локализации
-
class LocaleMiddleware
Включает выбор языка на основе данных из запроса. Он настраивает контент для каждого пользователя. См. документацию по интернационализации.
-
LocaleMiddleware.response_redirect_class
По умолчанию используется HttpResponseRedirect. Подклассируйте LocaleMiddleware и переопределите атрибут для настройки перенаправлений, выполняемых среднесвязью.
Среднесвязь сообщений
-
class MessageMiddleware[source]
Включает поддержку сообщений на основе файлов cookie и сеансов. См. документацию по сообщениям.
Среднесвязь безопасности
Предупреждение
Если это возможно в вашей среде развертывания, обычно рекомендуется выполнять функции, предоставляемые SecurityMiddleware, на вашем веб-сервере перед Django. Таким образом, запросы, которые не обслуживаются Django (такие как статические ресурсы или загруженные пользователем файлы), будут иметь те же средства защиты, что и запросы к вашему приложению Django.
-
class SecurityMiddleware
Среднесвязь django.middleware.security.SecurityMiddleware предоставляет несколько улучшений безопасности для цикла «запрос/ответ». Каждый из них может быть независимо включён или выключен с помощью настроек.
SECURE_BROWSER_XSS_FILTERSECURE_CONTENT_TYPE_NOSNIFFSECURE_HSTS_INCLUDE_SUBDOMAINSSECURE_HSTS_PRELOADSECURE_HSTS_SECONDSSECURE_REDIRECT_EXEMPTSECURE_REFERRER_POLICYSECURE_SSL_HOSTSECURE_SSL_REDIRECT
HTTP Strict Transport Security
Для сайтов, которые должны быть доступны только через HTTPS, вы можете указать современным браузерам отклонять подключение к вашему домену через небезопасное соединение (в течение определённого периода времени) путём установки заголовка “Strict-Transport-Security”. Это снижает вашу уязвимость к некоторым атакам SSL-stripping man-in-the-middle (MITM).
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.
Политика переадресации Referrer
Браузеры используют заголовок Referer в качестве способа отправки информации на сайт о том, как пользователи туда попали. Когда пользователь нажимает ссылку, браузер отправляет полный URL-адрес страницы ссылки в качестве referer. Хотя это может быть полезно для некоторых целей — например, для выяснения, кто ссылается на ваш сайт — это также может вызывать проблемы с конфиденциальностью, сообщая одному сайту, что пользователь посещал другой сайт.
Некоторые браузеры имеют возможность принимать подсказки о том, следует ли отправлять заголовок HTTP Referer при нажатии пользователем ссылки; эта подсказка предоставляется через заголовок Referrer-Policy. Этот заголовок может предложить браузерам любое из трёх поведений:
- Полный URL-адрес: отправляет весь URL-адрес в заголовке
Referer. Например, если пользователь посещаетhttps://example.com/page.html, заголовокRefererбудет содержать"https://example.com/page.html". - Только домен: отправляет только «домен» в referer. Домен состоит из схемы, хоста и (необязательно) номера порта. Например, если пользователь посещает
https://example.com/page.html, домен будетhttps://example.com/. - Без referer: вообще не отправлять заголовок
Referer.
Существуют два типа условий, которые этот заголовок может сообщить браузеру, чтобы он обращал на них внимание:
- Один и тот же домен или разные домены: ссылка от
https://example.com/1.htmlкhttps://example.com/2.html— одного домена. Ссылка отhttps://example.com/page.htmlкhttps://not.example.com/page.html— разных доменов. - Снижение протокола: снижение происходит, если страница, содержащая ссылку, обслуживается по протоколу HTTPS, но страница, на которую ведёт ссылка, не обслуживается по HTTPS.
Предупреждение
Когда ваш сайт обслуживается по протоколу HTTPS, система защиты от CSRF Django требует, чтобы заголовок Referer был присутствующим, поэтому полное отключение заголовка Referer повлияет на защиту от CSRF. Чтобы получить большинство преимуществ от отключения заголовков Referer при одновременном сохранении защиты от CSRF, рассмотрите возможность активации только referer одного домена.
SecurityMiddleware может установить заголовок Referrer-Policy для вас на основе настройки SECURE_REFERRER_POLICY (обратите внимание на написание: браузеры отправляют заголовок Referer при нажатии пользователем ссылки, но заголовок, инструктирующий браузер, делать это, пишется как Referrer-Policy). Допустимые значения для этой настройки:
-
no-referrer - Инструктирует браузер не отправлять referer для ссылок, нажатых на этом сайте.
-
no-referrer-when-downgrade - Инструктирует браузер отправлять полный URL-адрес в качестве referer, но только когда не происходит снижение протокола.
-
origin - Инструктирует браузер отправлять только домен, а не полный URL-адрес, в качестве referer.
-
origin-when-cross-origin - Инструктирует браузер отправлять полный URL-адрес для ссылок одного домена и только домен для ссылок разных доменов.
-
same-origin - Инструктирует браузер отправлять полный URL-адрес, но только для ссылок одного домена. Не будет отправляться referer для ссылок разных доменов.
-
strict-origin - Инструктирует браузер отправлять только домен, а не полный URL-адрес, и не отправлять referer при снижении протокола.
-
strict-origin-when-cross-origin - Инструктирует браузер отправлять полный URL-адрес, если ссылка — одного домена и не происходит снижение протокола; отправлять только домен, если ссылка — разных доменов и не происходит снижение протокола; и не отправлять referer, если происходит снижение протокола.
-
unsafe-url - Инструктирует браузер всегда отправлять полный URL-адрес в качестве referer.
Неизвестные значения политики
Если значение политики неизвестно пользовательскому агенту, можно указать несколько значений политики, чтобы обеспечить резервное копирование. Последнее указанное значение, которое понимается, имеет приоритет. Для поддержки этого можно использовать итерируемый объект или строку, разделённую запятыми, с настройкой SECURE_REFERRER_POLICY.
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 обслуживается напрямую вашим front-end веб-сервером (nginx, Apache и т. д.), то вы хотите установить этот заголовок там. С другой стороны, если вы используете Django для выполнения чего-то вроде проверки подлинности при загрузке файлов, и вы не можете установить заголовок с помощью вашего веб-сервера, эта настройка будет полезна.
X-XSS-Protection: 1; mode=block
Некоторые браузеры способны блокировать содержимое, которое похоже на атаку XSS. Они работают, ища JavaScript-содержимое в параметрах GET или POST страницы. Если JavaScript воспроизводится в ответе сервера, страница блокируется от отображения, и вместо неё отображается страница ошибки.
Заголовок X-XSS-Protection используется для управления работой фильтра XSS.
Чтобы включить фильтр 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
Включает поддержку сессий. Смотрите документацию по сессиям.
Средства обработки сайтов
-
class CurrentSiteMiddleware[source]
Добавляет атрибут site, представляющий текущий сайт, к каждому входящему объекту HttpRequest. Смотрите документацию по средствам обработки сайтов.
Средства обработки аутентификации
-
class AuthenticationMiddleware
Добавляет атрибут user, представляющий текущего пользователя, вошедшего в систему, к каждому входящему объекту HttpRequest. Смотрите аутентификацию в веб-запросах.
-
class RemoteUserMiddleware
Средства обработки для использования аутентификации, предоставляемой веб-сервером. Смотрите аутентификацию с использованием REMOTE_USER для получения подробностей использования.
-
class PersistentRemoteUserMiddleware
Средства обработки для использования аутентификации, предоставляемой веб-сервером, когда она включена только на странице входа. Смотрите использование REMOTE_USER только на страницах входа для получения подробностей использования.
Средства обработки защиты от CSRF
-
class CsrfViewMiddleware
Добавляет защиту от межсайтовых поддельных запросов (CSRF), добавляя скрытые поля в формы POST и проверяя запросы на наличие правильного значения. Смотрите документацию по защите от межсайтовых поддельных запросов.
X-Frame-Options средства обработки
-
class XFrameOptionsMiddleware[source]
Простая защита от кликджекинга с помощью заголовка X-Frame-Options.
Порядок средств обработки
Вот некоторые подсказки по порядку различных классов Django средств обработки:
-
Он должен стоять в начале списка, если вы планируете включить перенаправление SSL, так как это позволит избежать выполнения ряда других ненужных средств обработки.
-
Перед теми, которые изменяют заголовок
Vary(SessionMiddleware,GZipMiddleware,LocaleMiddleware). -
Перед любыми средствами обработки, которые могут изменять или использовать тело ответа.
После
UpdateCacheMiddleware: изменяет заголовокVary. -
Перед любыми средствами обработки, которые могут вызывать исключение для запуска представления ошибки (например,
PermissionDenied), если вы используетеCSRF_USE_SESSIONS.После
UpdateCacheMiddleware: изменяет заголовокVary. -
Перед любыми средствами обработки, которые могут изменить ответ (он устанавливает заголовок
ETag).После
GZipMiddleware, чтобы не вычислять заголовокETagдля сжатых содержимых. -
Один из самых верхних, после
SessionMiddleware(использует данные сессии) иUpdateCacheMiddleware(меняет заголовокVary). -
Перед любыми средствами обработки, которые могут изменить ответ (он устанавливает заголовок
Content-Length). Средства обработки, которые появляются доCommonMiddlewareи изменяют ответ, должны сброситьContent-Length.Ближе к верху: перенаправляет, если
APPEND_SLASHилиPREPEND_WWWустановлены вTrue.После
SessionMiddlewareесли вы используетеCSRF_USE_SESSIONS. -
Перед любыми средствами обработки представлений, которые предполагают, что с атаками CSRF покончено.
Перед
RemoteUserMiddlewareили любыми другими средствами обработки аутентификации, которые могут выполнить вход в систему, а следовательно, сбросить токен CSRF, прежде чем вызвать цепочку средств обработки.После
SessionMiddlewareесли вы используетеCSRF_USE_SESSIONS. -
После
SessionMiddleware: использует хранилище сессий. -
После
SessionMiddleware: может использовать хранилище на основе сессии. -
После любого средства обработки, изменяющего заголовок
Vary: этот заголовок используется для выбора значения для ключа хэширования кеша. -
Должен находиться внизу, так как это средство обработки крайнего случая.
-
Должен находиться внизу, так как это средство обработки крайнего случая.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/ref/middleware/