Установка заголовков безопасности позволяет повысить устойчивость веб-сервера к хакерским атакам. Использование некоторых из них будет полезно не только администраторам, но и SEO-оптимизаторам.
Многие хостинг-провайдеры не включают заголовки безопасности в базовую конфигурацию выделенных серверов из-за проблем совместимости с веб-браузерами.
Рекомендованные заголовки ответа из этого руководства можно использовать без опасений за доступность сайта для пользователей и поисковых систем.
Синтаксис проверен на сайтах под управлением WordPress 6.0 и 1С-Битрикс «Управление сайтом» 22.0.400 на веб-сервере Nginx 1.18.0 с обработчиком PHP-FPM.
Чтобы повысить уровень защиты сайта от кликджекинга, внедрения вредоносного кода и XSS-атак, рекомендуется использовать заголовки ответа:
- X-XSS-Protection;
- HTTP Strict Transport Security (сокр. HSTS);
- X-Frame-Options;
- X-Content-Type-Options;
- Content Security Policy;
- Referrer-Policy.
Добавление заголовков ответа в Nginx
Добавить заголовки можно через терминал или панель управления вашего хостинг-провайдера, например ISPmanager.
Запись заголовка через терминал
- Откройте терминал, перейдите в каталог
/etc/nginx/sites-enabled/%domain%/
(по умолч.); - Сделайте резервную копию файла конфигурации;
- Запишите заголовок в
%domain%.conf
в секции Server с помощью редактора vim или nano; - Перезагрузите Nginx.
Запись заголовка через ISPmanager
- В контекстном меню на левой панели кликните по ссылке Сайты;
- Отметьте нужный сайт с помощью чекбокса;
- Нажмите
Файлы конфигурации
; - Добавьте заголовок в редактор и нажмите
Сохранить
.
Изменение конфигурации возможно только с правами суперпользователя.
X-XSS-Protection
Отчасти устаревший заголовок, который обеспечивает запрет выполнения встроенного JavaScript-кода в браузерах без поддержки политики безопасности контента (Content Security Policy).
Директивы
Значение | Описание |
---|---|
0 | Отключает фильтрацию XSS. |
1 | Включает фильтрацию XSS. Если будет замечена попытка межсайтового скриптинга, браузер удалит небезопасное содержимое. |
1; mode=block | Включает фильтрацию XSS. Вместо того, чтобы очищать содержимое страницы, браузер предотвратит отображение страницы, если заметит атаку. |
1; report=<reporting-uri> | Включает фильтрацию XSS. При обнаружении атаки межсайтового скриптинга, браузер очистит страницу от небезопасного содержимого и сообщит о нарушении. |
Вы можете игнорировать данный заголовок если на сервере настроена сильная политика CSP. В остальных случаях, используйте:
add_header X-XSS-Protection "1; mode=block";
HTTP Strict Transport Security
Для сайтов работающих по протоколу HTTPS рекомендуется указывать заголовок ответа HSTS для принудительного перенаправления страниц с HTTP на HTTPS.
Директивы
Значение | Описание |
---|---|
max-age=<expire-time> | Время, в секундах, до окончания срока принудительной работы сервера по протоколу HTTPS. |
includeSubDomains | Правило max-age должно применяется ко всем поддоменам сайта. |
preload | Опциональный параметр добавления сайта в список предварительной загрузки. |
Перед использованием убедитесь, что все страницы на сайте доступны по HTTPS, иначе они станут недоступны для пользователей:
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
Включаем сайт в HSTS Preload List
Чтобы добавить сайт в список предварительной загрузки Chrome HSTS, отправьте доменное имя через специальную форму.
X-Frame-Options
Заголовок ограничивает показ встроенного контента в браузере внутри тегов: <frame>
, <iframe>
, <embed>
и <object>
.
Директивы
Значение | Описание |
---|---|
DENY | Запрещает загрузку контента в frame/iframe. |
SAMEORIGIN | Разрешает загрузку контента в рамках текущего домена. |
ALLOW-FROM uri | Разрешает загрузку контента в frame/iframe только для указанного URI. |
Правило позволяет избежать кликджекинга, гарантируя, что страницы с вашего сайта не будут встроены на других площадках:
add_header X-Frame-Options SAMEORIGIN always;
X-Content-Type-Options
Отправка заголовка ответа со значением nosniff не позволит браузеру анализировать MIME ответ, отличный от объявленного типа содержимого. Директива nosniff применяется только к типам script
и style
:
add_header X-Content-Type-Options nosniff;
Content Security Policy
Заголовок ответа позволяющий распознавать и устранять определенные типы атак, такие как межсайтовый скриптинг, сниффинг и внедрение данных. CSP содержит инструкции для загрузки контента из доверенных источников.
Для его гибкой настройки требуется определить из каких источников ваш сайт получает контент. Обычно это серверы популярных компаний с которых сайт может подключать: скрипты, стили, шрифты и изображения.
Часто используемые директивы
Значение | Описание |
---|---|
default-src | Список источников загрузки любого контента. |
script-src | Список источников загрузки скриптов. |
font-src | Список источников загрузки шрифтов. |
img-src | Список источников загрузки изображений. |
Примеры из практики
- На сайте используются шрифты Google Fonts, разрешаем загрузку файлов шрифта:
add_header Content-Security-Policy "default-src 'self'; font-src 'self' data: https://fonts.gstatic.com:*; always";
- На сайте под управлением WordPress используется Gravatar, разрешаем загрузку изображений:
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https://secure.gravatar.com:*; always";
- На сайте используются inline-сценарии (не рекомендуется):
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; always";
Отладка CSP
Определить блокировку контента на сайте можно с помощью DevTools. При возникновении проблем с политикой безопасности в консоли будут напечатаны ошибки с развернутым описанием.
Referrer-Policy
Заголовок позволяет верно отслеживать переходы пользователей между сайтами. Сервисы сбора статистики, например Google Analytics и Яндекс.Метрика, используют реферер для сбора источников перехода.
Директивы
Значение | Описание |
---|---|
no-referrer | Заголовок запроса будет опущен: отправленные запросы не будут содержать никакой информации. |
no-referrer-when-downgrade | В заголовке запроса будут содержаться: источник, путь и строка запроса, если уровень безопасности протокола останется прежним или улучшится (HTTP -> HTTP, HTTP -> HTTPS, HTTPS -> HTTPS). |
origin | В заголовке запроса будет содержаться только источник. Например, документ по адресу https://example.com/page.html отправит реферер https://example.com/. |
origin-when-cross-origin | В заголовке запроса будут содержаться: источник, путь и строка запроса при выполнении из того же источника на том же уровне протокола (HTTP -> HTTP, HTTPS -> HTTPS). Для запросов между источниками и запросов к менее безопасным адресатам (HTTPS -> HTTP) будет отправлен только источник. |
same-origin | В заголовке запроса будут содержаться: источник, путь и строка запроса для запросов с одним и тем же источником. |
strict-origin | В заголовке запроса будет содержаться только источник, если уровень безопасности протокола останется прежним (HTTPS -> HTTPS). При запросах к менее безопасным адресатам (HTTPS -> HTTP) заголовок будет очищен. |
strict-origin-when-cross-origin (default) | В заголовке запроса будут содержаться: источник, путь и строка запроса при выполнении запроса из того же источника. Для запросов между разными источниками с прежним уровнем безопасности (HTTPS -> HTTPS) будет отправлен только источник. При запросах к менее безопасным адресатам (HTTPS -> HTTP) заголовок будет очищен. |
unsafe-url | В заголовке запроса будет содержаться: источник, путь и строку запроса при выполнении любого запроса. |
Директивы заголовка позволяют гибко настроить объем информации, которую передает сервер в момент перехода пользователей по внешним ссылкам:
add_header Referrer-Policy 'strict-origin-when-cross-origin';
А при чем тут SEO оптимизаторы?
Пользователи Screaming Frog могли заметить, что заголовки безопасности входят в основной чеклист тестирования страниц.
Здравствуйте. Можно расшифровать вот эту Вшу последовательность strict-origin-when-cross-origin…. Из орписания выше не совсем понятно что и как прописывать…
Добрый день, Юрий!
Этот код позволяет ограничить информацию, отправляемую браузером на сервер о том, с какого сайта был выполнен запрос. Это повышает конфиденциальность пользователей и защищает веб-сервер от атак типа «утечка реферера».
Для настройки достаточно разместить заголовок в конфигурации Nginx внутри секции server: