Среднесвязь
В этом документе объясняются все компоненты среднесвязи, которые поставляются с 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.При необходимости отдельные представления могут быть исключены из поведения
APPEND_SLASHс помощью декоратораno_append_slash():from django.views.decorators.common import no_append_slash @no_append_slash def sensitive_fbv(request, *args, **kwargs): """View to be excluded from APPEND_SLASH.""" return HttpResponse()Изменено в Django 3.2:Была добавлена поддержка декоратора
no_append_slash(). - Устанавливает заголовок
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
Обрабатывает операции условного получения. Если у ответа нет заголовка ETag , среднесвязь добавит его, если необходимо. Если у ответа есть заголовок ETag или Last-Modified , а у запроса есть If-None-Match или If-Modified-Since , ответ заменяется на HttpResponseNotModified.
Среднесвязь локали
-
class LocaleMiddleware
Включает выбор языка на основе данных из запроса. Настраивает содержимое для каждого пользователя. См. документацию по интернационализации.
-
LocaleMiddleware.response_redirect_class
По умолчанию HttpResponseRedirect. Подклассы LocaleMiddleware и переопределение атрибута для настройки перенаправлений, выполняемых среднесвязью.
Среднесвязь сообщений
-
class MessageMiddleware
Включает поддержку сообщений на основе файлов cookie и сеансов. См. документацию по сообщениям.
Среднесвязь безопасности
Предупреждение
Если ваша ситуация развертывания позволяет, обычно рекомендуется использовать ваш веб-сервер на переднем крае для выполнения функций, предоставляемых среднесвязью SecurityMiddleware. Таким образом, если существуют запросы, которые не обрабатываются 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”. Это снижает вашу уязвимость к некоторым атакам типа "man-in-the-middle" (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.
Политика Referrer
Браузеры используют заголовок Referer для передачи информации о том, как пользователи попали на сайт. Когда пользователь нажимает ссылку, браузер отправляет полный URL-адрес страницы-источника в качестве referer. Хотя это может быть полезно для некоторых целей – например, для выяснения того, кто ссылается на ваш сайт – это также может вызвать проблемы с конфиденциальностью, сообщая одному сайту о посещении пользователем другого сайта.
Некоторые браузеры могут принимать подсказки о том, следует ли отправлять заголовок HTTP Referer при нажатии пользователем ссылки; эта подсказка предоставляется через заголовок Referrer-Policy. Этот заголовок может предложить браузерам любое из трех поведений:
- Полный URL: отправьте весь URL-адрес в заголовке
Referer. Например, если пользователь посещаетhttps://example.com/page.html, заголовокRefererбудет содержать"https://example.com/page.html". - Только Origin: отправьте только «origin» в referrer. Origin состоит из схемы, хоста и (необязательно) номера порта. Например, если пользователь посещает
https://example.com/page.html, origin будетhttps://example.com/. - Без referrer: вообще не отправляйте заголовок
Referer.
Существует два типа условий, которые этот заголовок может указать браузеру для проверки:
- Один и тот же origin или разный origin: ссылка из
https://example.com/1.htmlвhttps://example.com/2.htmlявляется ссылкой одного origin. Ссылка изhttps://example.com/page.htmlвhttps://not.example.com/page.html— ссылка с другим origin. - Понижение протокола: понижение происходит, если страница, содержащая ссылку, обслуживается через HTTPS, но страница, на которую ссылаются, — не через HTTPS.
Предупреждение
Когда ваш сайт обслуживается через HTTPS, система защиты CSRF Django требует наличия заголовка Referer, поэтому полное отключение заголовка Referer повлияет на защиту CSRF. Чтобы получить большинство преимуществ отключения заголовков Referer и в то же время сохранить защиту CSRF, рассмотрите возможность включения только referrers одного origin.
Django может установить заголовок Referrer-Policy для вас, основываясь на параметре SECURE_REFERRER_POLICY (обратите внимание на написание: браузеры отправляют заголовок Referer при нажатии пользователем ссылки, но заголовок, указывающий браузеру, как действовать, пишется как Referrer-Policy). Допустимые значения для этого параметра:
-
no-referrer - Указывает браузеру не отправлять referrer для ссылок, на которые кликнули на этом сайте.
-
no-referrer-when-downgrade - Указывает браузеру отправлять полный URL в качестве referrer, но только при отсутствии понижения протокола.
-
origin - Указывает браузеру отправлять только origin, а не полный URL, в качестве referrer.
-
origin-when-cross-origin - Указывает браузеру отправлять полный URL для ссылок одного origin и только origin для ссылок другого origin.
-
same-origin - Указывает браузеру отправлять полный URL, но только для ссылок одного origin. Без referrer для ссылок другого origin.
-
strict-origin - Указывает браузеру отправлять только origin, не полный URL, и не отправлять referrer при понижении протокола.
-
strict-origin-when-cross-origin - Указывает браузеру отправлять полный URL, когда ссылка является ссылкой одного origin и отсутствует понижение протокола; отправлять только origin, когда ссылка имеет другой origin и отсутствует понижение протокола; и не отправлять referrer при понижении протокола.
-
unsafe-url - Указывает браузеру всегда отправлять полный URL в качестве referrer.
Неизвестные значения политики
В случае, если значение политики неизвестно пользовательскому агенту, можно указать несколько значений политики для предоставления резервного варианта. Последнее заданное значение, которое понимается, имеет приоритет. Для поддержки этого можно использовать итерируемый объект или строку, разделенную запятыми, с 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 обслуживается непосредственно вашим веб-сервером (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, в балансировщике нагрузки или прокси-сервере на уровне front-end, таком как nginx. SECURE_SSL_REDIRECT предназначен для случаев развертывания, когда это невозможно.
Если параметр SECURE_SSL_HOST имеет значение, все перенаправления будут отправляться на этот хост вместо первоначально запрошенного хоста.
Если на вашем сайте есть несколько страниц, которые должны быть доступны по протоколу HTTP, а не перенаправлены на HTTPS, вы можете перечислить регулярные выражения для сопоставления этих URL-адресов в настройке SECURE_REDIRECT_EXEMPT.
Примечание
Если вы развернуты за балансировщиком нагрузки или прокси-сервером, и Django не может определить, когда запрос уже защищен, вам может потребоваться установить настройку SECURE_PROXY_SSL_HEADER.
Средства обработки сеансов
-
class SessionMiddleware
Включает поддержку сеансов. См. документацию по сеансам.
Средства обработки сайтов
-
class CurrentSiteMiddleware
Добавляет атрибут site, представляющий текущий сайт, к каждому входящему объекту HttpRequest. См. документацию по сайтам.
Средства обработки аутентификации
-
class AuthenticationMiddleware
Добавляет атрибут user, представляющий текущего пользователя, к каждому входящему объекту HttpRequest. См. Аутентификация в веб-запросах.
-
class RemoteUserMiddleware
Средства обработки для использования аутентификации, предоставленной веб-сервером. См. Аутентификация с использованием REMOTE_USER для подробных сведений об использовании.
-
class PersistentRemoteUserMiddleware
Средства обработки для использования аутентификации, предоставленной веб-сервером, когда она включена только на странице входа. См. Использование REMOTE_USER только на страницах входа для подробных сведений об использовании.
Средства обработки защиты CSRF
-
class CsrfViewMiddleware
Добавляет защиту от межсайтовых поддельных запросов (CSRF), добавляя скрытые поля формы к формам POST и проверяя запросы на наличие правильного значения. См. документацию по защите от межсайтовых поддельных запросов.
X-Frame-Options средства обработки
-
class XFrameOptionsMiddleware
Простая защита от кликджекинга с помощью заголовка 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.2/ref/middleware/