Security Headers · База знаний

Security headers для сайта: CSP, HSTS, X-Frame-Options — полное руководство 2026

HTTP-заголовки безопасности — это одна строка nginx-конфигурации, которая закрывает целый класс атак. Разбираем 7 ключевых заголовков: что делает каждый, как атакующий использует их отсутствие, и как правильно настроить.

Проверить headers своего сайта →
AuditGuard проверяет все security headers автоматически — и покажет, каких не хватает, что настроено неправильно и как исправить. Занимает 2–4 минуты, бесплатно.

Что такое 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 может сломать сайт — перестанут работать встроенные скрипты, Google Analytics, чат-виджеты. Начинайте с report-only режима.

Минимальный CSP для статического сайта

Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'; base-uri 'self'; object-src 'none'; upgrade-insecure-requests; report-uri /csp-report

Ключевые директивы CSP

Лучшая практика: начните с Content-Security-Policy-Report-Only — заголовок не блокирует ресурсы, только собирает отчёты о нарушениях. Изучите логи, затем переключайтесь на боевой режим.

2. HTTP Strict Transport Security (HSTS)

Что защищает: SSL-stripping атаки, перехват незащищённого трафика.

HSTS говорит браузеру: «никогда не подключайся к этому домену по HTTP — только по HTTPS». Даже если пользователь вводит http://example.com, браузер автоматически переходит на HTTPS ещё до отправки запроса. Это делает невозможной атаку SSL-stripping (когда MITM перехватывает первый HTTP-запрос).

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
⚠️ Осторожно: включайте HSTS только когда сайт стабильно работает на HTTPS. После включения браузер будет отказываться от HTTP-подключений на max-age секунд, и откатиться назад сложно.

3. X-Frame-Options

Что защищает: clickjacking — атака, когда ваш сайт встраивается в невидимый iframe.

X-Frame-Options: SAMEORIGIN

Значения: DENY (никогда не встраивать), SAMEORIGIN (встраивать только с того же домена). Современная альтернатива — директива frame-ancestors в CSP. Оба заголовка рекомендуется использовать одновременно для совместимости со старыми браузерами.

4. X-Content-Type-Options

Что защищает: MIME-sniffing атаки, когда браузер угадывает тип файла и выполняет его как скрипт.

X-Content-Type-Options: nosniff

Этот однострочный заголовок предотвращает атаку MIME confusion: загруженный злоумышленником файл с расширением .jpg не будет интерпретирован как JavaScript, даже если содержит исполняемый код.

5. Referrer-Policy

Что защищает: утечка чувствительных URL-параметров (токены, ID сессий) на сторонние сайты.

Referrer-Policy: strict-origin-when-cross-origin

По умолчанию браузер передаёт полный URL страницы в заголовке Referer при переходе. Если URL содержит токен (?token=abc123), он утечёт в аналитику стороннего сайта. strict-origin-when-cross-origin передаёт только домен при кросс-доменных переходах.

6. Permissions-Policy

Что защищает: несанкционированный доступ к геолокации, камере, микрофону.

Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=(self)

Заголовок явно указывает, какие API браузера разрешены. () означает запрет для всех, включая встроенные iframes. Если ваш сайт не использует геолокацию — запретите её явно, чтобы вредоносный iframe не мог запросить разрешение от имени вашего домена.

7. Cross-Origin заголовки (CORP, COEP, COOP)

Три современных заголовка, защищающих от Spectre-подобных атак через shared memory:

Готовая конфигурация nginx

server { # HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # Clickjacking add_header X-Frame-Options "SAMEORIGIN" always; # MIME sniffing add_header X-Content-Type-Options "nosniff" always; # Referrer add_header Referrer-Policy "strict-origin-when-cross-origin" always; # Permissions add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; # Cross-Origin add_header Cross-Origin-Resource-Policy "same-origin" always; add_header Cross-Origin-Opener-Policy "same-origin" always; add_header Cross-Origin-Embedder-Policy "credentialless" always; # CSP (адаптируйте под ваш стек) add_header Content-Security-Policy "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; form-action 'self'; upgrade-insecure-requests; report-uri /csp-report" always; }
Важно: В nginx, если в блоке location есть свой add_header, он переопределяет все заголовки из блока server. Выносите security headers в отдельный файл-сниппет и включайте через include snippets/security-headers.conf; в каждом нужном location.

Как проверить security headers своего сайта

AuditGuard проверяет все заголовки автоматически при аудите и показывает, что именно отсутствует или настроено неправильно. Бесплатно, без регистрации, результат за 2–4 минуты.

Проверить security headers →