Защитные заголовки ответа

пошаговая инструкция · Быстро: 5–15 минут

← Все инструкции

1. Что произошло

Служебные заголовки ответа сервера включают встроенную защиту браузера от подделок и встраивания сайта в чужие страницы.

2. Почему это важно

Сайт легче атаковать (подмена, перехват кликов). Для обычного посетителя незаметно. После исправления: Закроет типовые уязвимости, повысит оценку безопасности.

3. На каких страницах обнаружено

Заголовки главной страницы: X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy, Content-Security-Policy.

Чтобы увидеть адреса на вашем сайте, откройте инструкцию из отчёта или добавьте домен в адрес: /fix/sec_headers/ваш-сайт.ru.

4. Как исправить

Шаги

  1. Добавьте безопасные заголовки (код ниже): они почти ничего не ломают — X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy.
  2. Content-Security-Policy мощный, но может сломать скрипты и виджеты. Сначала включите режим Content-Security-Policy-Report-Only, посмотрите ошибки в консоли браузера и только потом переключите в рабочий режим.
  3. Если сайт должен встраиваться на другие сайты (iframe), вместо SAMEORIGIN используйте директиву frame-ancestors в CSP.
WordPress
  1. Проще всего добавить заголовки на уровне сервера. Без доступа к серверу — mu-плагин из блока кода (подходит и для PHP-страниц, и для админки).
1С-Битрикс
  1. Заголовки добавляйте в конфиг nginx/Apache; из PHP — в /bitrix/php_interface/init.php через функцию header().
phpBB
  1. Добавьте заголовки в конфигурацию веб-сервера. Не включайте строгий CSP без проверки: админ-панель phpBB использует встроенные скрипты.

5. Готовый код

Замените example.com на свой домен. Перед правкой конфигурации сделайте резервную копию файла.

Любой сайт

CSP в режиме наблюдения (nginx)
add_header Content-Security-Policy-Report-Only "default-src 'self' https:; img-src 'self' data: https:; script-src 'self' 'unsafe-inline' https:; style-src 'self' 'unsafe-inline' https:" always;

WordPress

WordPress: mu-plugin
<?php
add_action('send_headers', function () {
    header('X-Content-Type-Options: nosniff');
    header('X-Frame-Options: SAMEORIGIN');
    header('Referrer-Policy: strict-origin-when-cross-origin');
    header('Permissions-Policy: camera=(), microphone=(), geolocation=()');
});

nginx

nginx
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

Apache

Apache
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>

6. Как проверить результат

  1. Команда должна показать добавленные заголовки.
  2. Пройдите по основным страницам и в консоли браузера (F12) убедитесь, что нет новых ошибок.
  3. Нажмите «Перепроверить сайт».
Заголовки ответа
curl -sI https://example.com/ | grep -iE 'x-content-type|x-frame|referrer-policy|permissions-policy|content-security'

Чтобы перепроверить сайт, откройте отчёт и нажмите «Проверить заново».