Среднее ПО
В этом документе описаны все компоненты среднего ПО, которые поставляются с Django. Сведения о том, как их использовать и как написать собственное среднее ПО, см. в руководстве по использованию среднего ПО.
Доступное среднее ПО
Среднее ПО кэширования
-
class UpdateCacheMiddleware[source]
-
class FetchFromCacheMiddleware[source]
Включите кэширование для всего сайта. Если они включены, каждая страница, работающая на Django, будет кэшироваться до тех пор, пока это определено параметром CACHE_MIDDLEWARE_SECONDS. См. документацию по кэшированию.
Среднее ПО «общего» назначения
-
class CommonMiddleware[source]
Добавляет несколько удобств для перфекционистов:
- Запрещает доступ к пользовательским агентам в параметре
DISALLOWED_USER_AGENTS, который должен быть списком скомпилированных объектов регулярных выражений. -
Выполняет переписывание URL-адресов на основе параметров
APPEND_SLASHиPREPEND_WWW.Если
APPEND_SLASHTrue, и начальный URL-адрес не заканчивается слешем, и он не найден в URLconf, тогда формируется новый URL-адрес путем добавления слеша в конец. Если этот новый URL-адрес найден в URLconf, то Django перенаправляет запрос на этот новый URL-адрес. В противном случае начальный URL-адрес обрабатывается обычным образом.Например,
foo.com/barбудет перенаправлен наfoo.com/bar/, если у вас нет действительного URL-шаблона дляfoo.com/bar, но есть действительный шаблон дляfoo.com/bar/.Если
PREPEND_WWWTrue, 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, если это уместно.
-
CommonMiddleware.response_redirect_class
По умолчанию HttpResponsePermanentRedirect. Подклассифицируйте CommonMiddleware и переопределите атрибут, чтобы настроить перенаправления, выполняемые средним ПО.
-
class BrokenLinkEmailsMiddleware[source]
- Отправляет уведомления по электронной почте о ссылках с ошибками адресатам в
MANAGERS(см. Отчет об ошибках).
Среднее ПО GZip
-
class GZipMiddleware[source]
Предупреждение
В последнее время исследователи в области информационной безопасности выявили, что при использовании методов сжатия (включая GZipMiddleware) на веб-сайте сайт становится уязвим для ряда возможных атак. Эти методы могут быть использованы для компрометации, среди прочего, защиты Django от CSRF. Перед использованием GZipMiddleware на вашем сайте необходимо очень тщательно оценить, подвергаетесь ли вы этим атакам. Если у вас есть любые сомнения в том, подвергаетесь ли вы воздействию, вам следует избегать использования GZipMiddleware. Более подробную информацию см. в документе документ BREACH (PDF) и breachattack.com.
Сжимает содержимое для браузеров, поддерживающих сжатие GZip (все современные браузеры).
Это среднее ПО должно быть размещено перед любым другим средним ПО, которому необходимо читать или записывать тело ответа, чтобы сжатие происходило после этого.
Сжатие содержимого не будет выполнено, если любое из следующих утверждений истинно:
- Тело содержимого меньше 200 байт.
- Ответ уже установил заголовок
Content-Encoding. - Запрос (браузер) не отправил заголовок
Accept-Encoding, содержащийgzip.
Вы можете применить сжатие GZip к отдельным представлениям с помощью декоратора gzip_page().
Среднее ПО условного получения
-
class ConditionalGetMiddleware[source]
Обрабатывает операции условного получения. Если ответ имеет заголовок ETag или Last-Modified, а запрос имеет заголовок If-None-Match или If-Modified-Since, ответ заменяется на HttpResponseNotModified.
Также устанавливает заголовки ответа Date и Content-Length.
Среднее ПО локалей
-
class LocaleMiddleware[source]
Включает выбор языка на основе данных из запроса. Он настраивает содержимое для каждого пользователя. См. документацию по интернационализации.
-
LocaleMiddleware.response_redirect_class
По умолчанию HttpResponseRedirect. Подклассифицируйте LocaleMiddleware и переопределите атрибут, чтобы настроить перенаправления, выполняемые средним ПО.
Среднее ПО сообщений
-
class MessageMiddleware[source]
Включает поддержку сообщений на основе cookie и сессий. См. документацию по сообщениям.
Среднее ПО безопасности
Предупреждение
Если позволяют условия развертывания, обычно рекомендуется, чтобы ваш веб-сервер front-end выполнял функции, предоставляемые средним ПО SecurityMiddleware. Таким образом, если есть запросы, которые не обслуживаются Django (например, статические медиафайлы или загруженные пользователем файлы), они будут иметь ту же защиту, что и запросы к вашему приложению Django.
-
class SecurityMiddleware[source]
Среднее ПО django.middleware.security.SecurityMiddleware предоставляет несколько улучшений безопасности для цикла запроса/ответа. Каждое из них можно независимо включить или выключить с помощью настройки.
SECURE_BROWSER_XSS_FILTERSECURE_CONTENT_TYPE_NOSNIFFSECURE_HSTS_INCLUDE_SUBDOMAINSSECURE_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), иначе ваш сайт может остаться уязвимым к небезопасным подключениям к поддомену.
Предупреждение
Политика HSTS применяется ко всему вашему домену, а не только к URL-адресу ответа, для которого вы установили заголовок. Поэтому следует использовать её только если весь ваш домен обслуживается только через HTTPS.
Браузеры, корректно обрабатывающие заголовок HSTS, откажутся от возможности пользователей пропустить предупреждения и подключиться к сайту с истекшим, самоподписанным или иным образом недействительным сертификатом SSL. Если вы используете HSTS, убедитесь, что ваши сертификаты в порядке и остаются в таком состоянии!
Примечание
Если вы развернуты за балансировщиком нагрузки или прокси-сервером обратного проксирования, и заголовок Strict-Transport-Security не добавляется в ваши ответы, это может быть потому, что Django не понимает, что находится в безопасном соединении; возможно, вам потребуется установить настройку SECURE_PROXY_SSL_HEADER.
X-Content-Type-Options: nosniff
Некоторые браузеры пытаются угадать типы контента загружаемых ресурсов, переопределяя заголовок Content-Type. Хотя это может помочь отобразить сайты с неправильно настроенными серверами, это также может представлять собой угрозу безопасности.
Если ваш сайт предоставляет загружаемые пользователем файлы, злоумышленник может загрузить специально сконструированный файл, который браузер интерпретирует как HTML или JavaScript, в то время как вы ожидаете нечто безобидное.
Чтобы узнать больше об этом заголовке и о том, как браузер его обрабатывает, вы можете прочитать об этом в блоге безопасности IE.
Чтобы предотвратить угадывание браузером типа контента и заставить его всегда использовать тип, указанный в заголовке 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[source]
Добавляет атрибут user, представляющий текущего пользователя, авторизованного в системе, ко всем входящим объектам HttpRequest. См. Аутентификация в веб-запросах.
-
class RemoteUserMiddleware[source]
Средства мидлвары для использования аутентификации, предоставляемой веб-сервером. Подробности использования см. в Аутентификация с помощью REMOTE_USER.
-
class SessionAuthenticationMiddleware[source]
Позволяет аннулировать сессии пользователя при изменении пароля. Подробности см. в Аннулирование сессий при изменении пароля. Этот мидлвар должен следовать за django.contrib.auth.middleware.AuthenticationMiddleware в настройке MIDDLEWARE_CLASSES.
Средства мидлвары защиты CSRF
-
class CsrfViewMiddleware[source]
Добавляет защиту от межсайтовых поддельных запросов (CSRF), добавляя скрытые поля в формы POST и проверяя запросы на правильное значение. См. документацию по защите от межсайтовых поддельных запросов.
Средства обработки X-Frame-Options
-
class XFrameOptionsMiddleware[source]
Простая защита от кликджекинга с помощью заголовка X-Frame-Options.
Порядок обработки промежуточного ПО
Вот некоторые советы по порядку различных классов промежуточного ПО Django:
-
Перед теми, которые изменяют заголовок
Vary(SessionMiddleware,GZipMiddleware,LocaleMiddleware). -
Перед любым промежуточным ПО, которое может изменить или использовать тело ответа.
После
UpdateCacheMiddleware: Изменяет заголовокVary. -
Перед
CommonMiddleware: использует свой заголовокEtag, когдаUSE_ETAGS=True. -
После
UpdateCacheMiddleware: Изменяет заголовокVary. -
Один из самых верхних, после
SessionMiddleware(использует данные сеанса) иUpdateCacheMiddleware(изменяет заголовокVary). -
Перед любым промежуточным ПО, которое может изменить ответ (вычисляет
ETags).После
GZipMiddleware, чтобы не вычислять заголовокETagдля сжатых содержимых.Ближе к верху: перенаправляет, когда
APPEND_SLASHилиPREPEND_WWWустановлены вTrue. -
Перед любым промежуточным ПО представления, которое предполагает, что атаки CSRF были обработаны.
-
После
SessionMiddleware: использует хранилище сеансов. -
После
SessionMiddleware: может использовать хранилище на основе сеансов. -
После любого промежуточного ПО, которое изменяет заголовок
Vary: этот заголовок используется для выбора значения для ключа хэша кэша. -
Должно быть внизу, так как это промежуточное ПО последней инстанции.
-
Должно быть внизу, так как это промежуточное ПО последней инстанции.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/middleware/