ПОСРЕДНИЧНЫЙ СЛОЙ
В данном документе описываются все компоненты посреднического слоя, поставляемые с 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. - Устанавливает заголовок
Content-Lengthдля ответов, не являющихся потоковыми.
-
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().
Посреднический слой условного GET
-
class ConditionalGetMiddleware[source]
Обрабатывает операции условного GET. Если в ответе нет заголовка ETag , посреднический слой добавляет его при необходимости. Если ответ имеет заголовок ETag или Last-Modified, а запрос имеет заголовки If-None-Match или If-Modified-Since, ответ заменяется ответом HttpResponseNotModified.
Посреднический слой локализации
-
class LocaleMiddleware[source]
Включает выбор языка на основе данных из запроса. Он настраивает контент для каждого пользователя. См. документацию по интернационализации.
-
LocaleMiddleware.response_redirect_class
По умолчанию HttpResponseRedirect. Подкласс LocaleMiddleware и переопределение атрибута позволяют настроить перенаправления, выполняемые посредническим слоем.
Посреднический слой сообщений
-
class MessageMiddleware[source]
Включает поддержку сообщений на основе файлов cookie и сессий. См. документацию по сообщениям.
Посреднический слой безопасности
Предупреждение
Если ваша среда развертывания это позволяет, обычно лучше, чтобы ваш веб-сервер выполнял функции, предоставляемые посредническим слоем SecurityMiddleware. Таким образом, если есть запросы, которые не обслуживаются Django (например, статические ресурсы или файлы, загруженные пользователем), они будут иметь те же защитные меры, что и запросы к вашему приложению Django.
-
class SecurityMiddleware[source]
Этот посреднический слой предоставляет несколько улучшений безопасности для цикла запроса/ответа. Каждый из них может быть независимо включён или выключен с помощью настроек.
SECURE_BROWSER_XSS_FILTERSECURE_CONTENT_TYPE_NOSNIFFSECURE_HSTS_INCLUDE_SUBDOMAINSSECURE_HSTS_PRELOADSECURE_HSTS_SECONDSSECURE_REDIRECT_EXEMPTSECURE_SSL_HOSTSECURE_SSL_REDIRECT
HTTP Strict Transport Security
Для сайтов, которые должны быть доступны только через 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 повторно воспроизводится в ответе сервера, отображение страницы блокируется, и вместо нее отображается страница с ошибкой.
Заголовок 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[source]
Включает поддержку сеансов. См. документацию по сеансам.
Средства промежуточного программного обеспечения сайтов
-
class CurrentSiteMiddleware[source]
Добавляет атрибут site, представляющий текущий сайт, к каждому входящему объекту HttpRequest. См. документацию по сайтам.
Средства промежуточного программного обеспечения аутентификации
-
class AuthenticationMiddleware
Добавляет атрибут user, представляющий текущего пользователя, к каждому входящему объекту HttpRequest. См. аутентификацию в веб-запросах.
-
class RemoteUserMiddleware
Средства промежуточного программного обеспечения для использования аутентификации, предоставленной веб-сервером. Подробнее см. аутентификацию с использованием REMOTE_USER.
-
class PersistentRemoteUserMiddleware
Средства промежуточного программного обеспечения для использования аутентификации, предоставленной веб-сервером, при активации только на странице входа. Подробное описание использования см. использование REMOTE_USER только на страницах входа.
Средства промежуточного программного обеспечения защиты CSRF
-
class CsrfViewMiddleware[source]
Обеспечивает защиту от поддельных межсайтовых запросов (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/2.2/ref/middleware/