Security headers для сайта: CSP, HSTS, X-Frame-Options — полное руководство 2026
HTTP-заголовки безопасности — это одна строка nginx-конфигурации, которая закрывает целый класс атак. Разбираем 7 ключевых заголовков: что делает каждый, как атакующий использует их отсутствие, и как правильно настроить.
Проверить headers своего сайта →Что такое security headers и зачем они нужны
Security headers — это HTTP-заголовки ответа сервера, которые указывают браузеру, как он должен обрабатывать контент страницы. Они не защищают сервер напрямую, но существенно ограничивают возможности атакующего, который уже нашёл XSS-уязвимость или другой вектор.
Большинство заголовков добавляется одной строкой в конфигурации nginx или Apache и не требует изменения кода приложения. При этом они закрывают атаки класса OWASP Top 10 — в частности, Injection и Security Misconfiguration.
1. Content-Security-Policy (CSP)
Что защищает: XSS (межсайтовый скриптинг), data injection, clickjacking через frame.
CSP — самый мощный и сложный заголовок. Он указывает браузеру, с каких источников разрешено загружать скрипты, стили, изображения, шрифты и другие ресурсы. Если атакующий внедрил вредоносный скрипт через XSS, CSP не позволит ему выполниться, если источник не разрешён.
Минимальный CSP для статического сайта
Ключевые директивы CSP
default-src 'self'— все ресурсы только с текущего домена (fallback)script-src— откуда грузить JS.'unsafe-inline'и'unsafe-eval'опасны — избегайтеframe-ancestors 'self'— только свой домен может встраивать страницу в iframe (защита от clickjacking)object-src 'none'— запрещает Flash и плагиныupgrade-insecure-requests— заменяет http:// на https:// в ресурсахreport-uri /csp-report— браузер сообщает о нарушениях
Content-Security-Policy-Report-Only — заголовок не блокирует ресурсы, только собирает отчёты о нарушениях. Изучите логи, затем переключайтесь на боевой режим.2. HTTP Strict Transport Security (HSTS)
Что защищает: SSL-stripping атаки, перехват незащищённого трафика.
HSTS говорит браузеру: «никогда не подключайся к этому домену по HTTP — только по HTTPS». Даже если пользователь вводит http://example.com, браузер автоматически переходит на HTTPS ещё до отправки запроса. Это делает невозможной атаку SSL-stripping (когда MITM перехватывает первый HTTP-запрос).
max-age=31536000— браузер помнит правило 1 годincludeSubDomains— распространяется на поддоменыpreload— заявка на включение в HSTS Preload List (список браузеров)
max-age секунд, и откатиться назад сложно.3. X-Frame-Options
Что защищает: clickjacking — атака, когда ваш сайт встраивается в невидимый iframe.
Значения: DENY (никогда не встраивать), SAMEORIGIN (встраивать только с того же домена). Современная альтернатива — директива frame-ancestors в CSP. Оба заголовка рекомендуется использовать одновременно для совместимости со старыми браузерами.
4. X-Content-Type-Options
Что защищает: MIME-sniffing атаки, когда браузер угадывает тип файла и выполняет его как скрипт.
Этот однострочный заголовок предотвращает атаку MIME confusion: загруженный злоумышленником файл с расширением .jpg не будет интерпретирован как JavaScript, даже если содержит исполняемый код.
5. Referrer-Policy
Что защищает: утечка чувствительных URL-параметров (токены, ID сессий) на сторонние сайты.
По умолчанию браузер передаёт полный URL страницы в заголовке Referer при переходе. Если URL содержит токен (?token=abc123), он утечёт в аналитику стороннего сайта. strict-origin-when-cross-origin передаёт только домен при кросс-доменных переходах.
6. Permissions-Policy
Что защищает: несанкционированный доступ к геолокации, камере, микрофону.
Заголовок явно указывает, какие API браузера разрешены. () означает запрет для всех, включая встроенные iframes. Если ваш сайт не использует геолокацию — запретите её явно, чтобы вредоносный iframe не мог запросить разрешение от имени вашего домена.
7. Cross-Origin заголовки (CORP, COEP, COOP)
Три современных заголовка, защищающих от Spectre-подобных атак через shared memory:
Cross-Origin-Resource-Policy: same-origin— ресурсы сайта нельзя загрузить с других доменовCross-Origin-Opener-Policy: same-origin— изолирует window.opener, предотвращает navigation attacksCross-Origin-Embedder-Policy: credentialless— требуется для SharedArrayBuffer и высокоточных таймеров
Готовая конфигурация nginx
location есть свой add_header, он переопределяет все заголовки из блока server. Выносите security headers в отдельный файл-сниппет и включайте через include snippets/security-headers.conf; в каждом нужном location.
Как проверить security headers своего сайта
AuditGuard проверяет все заголовки автоматически при аудите и показывает, что именно отсутствует или настроено неправильно. Бесплатно, без регистрации, результат за 2–4 минуты.
Проверить security headers →