Security headers: что выставить на сервере

Security headers: что выставить на сервере

Мы разобрали CORS, CSP, XSS, CSRF и аутентификацию. В этом уроке соберём всё вместе в виде security-чекера — набора HTTP-заголовков, которые должны быть на каждом production-сайте. Эти заголовки — не теория, это базовая гигиена сервера.

Чеклист security-заголовков

Вот минимальный набор заголовков, которые должны быть на каждом сайте (даже лендинге):

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; ...
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()

Strict-Transport-Security (HSTS)

Уже разбирали в модуле 7, но повторим в контексте чеклиста. HSTS — это «всегда HTTPS»:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Без этого заголовка сайт не считается полностью безопасным, даже если настроен HTTPS-редирект. HSTS Preload List — дополнительная защита первого захода.

Content-Security-Policy (CSP)

Подробно разбирали в уроке 11-2. Минимальная CSP для большинства сайтов:

Content-Security-Policy:
  default-src 'self';
  script-src 'self';
  style-src 'self' 'unsafe-inline';
  img-src 'self' https: data:;
  font-src 'self' https://fonts.gstatic.com;
  object-src 'none';
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self';

X-Content-Type-Options

Запрещает браузеру угадывать MIME-тип (MIME sniffing). Без этого заголовка браузер может выполнить текстовый файл как JavaScript, если в начале файла есть что-то похожее на код:

X-Content-Type-Options: nosniff

Этот заголовок предотвращает атаку, при которой злоумышленник загружает файл с безобидным расширением (.txt), но содержимым <script>. Без nosniff браузер может распознать его как HTML и выполнить скрипт.

X-Frame-Options / frame-ancestors

Запрещает встраивание сайта в <iframe> на других доменах (защита от clickjacking):

X-Frame-Options: DENY

Современная альтернатива — CSP-директива frame-ancestors 'none'. Она гибче (можно разрешить конкретные домены). Рекомендуется использовать обе для совместимости со старыми браузерами.

Referrer-Policy

Управляет, сколько информации о предыдущей странице отправляется в заголовке Referer при переходе:

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

Значения:

  • no-referrer — никогда не отправлять Referer (максимальная приватность).
  • strict-origin-when-cross-origin — на другие домены отправлять только origin (без пути). Баланс приватности и аналитики.
  • unsafe-url — отправлять полный URL всегда (включая путь и query). Не рекомендуется.

Permissions-Policy

Запрещает доступ к API браузера (камера, микрофон, геолокация) для самого сайта и для встроенных iframe:

Permissions-Policy: camera=(), microphone=(), geolocation=(), usb=()

Пустые скобки () означают «запрещено всем». Можно разрешить своему origin: camera=self. Этот заголовок гарантирует, что даже если на страницу внедрён вредоносный скрипт, он не получит доступ к камере или микрофону через Web API.

Как проверить security-заголовки сайта

Сайт securityheaders.com анализирует HTTP-ответ и ставит оценку (A+ до F). Проверяет наличие и корректность HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy.

Можно проверить вручную через curl:

curl -I https://example.com | grep -E 'strict-transport|content-security|x-frame|x-content|referrer-policy|permissions-policy'

В DevTools: вкладка Network → запрос → Headers → Response Headers. Все security-заголовки видны.

Порядок внедрения на production

Внедрять security-заголовки лучше поэтапно, от простого к сложному:

  1. Минимальный набор (каждому сайту): HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy. Эти заголовки безопасны и не могут ничего сломать.
  2. Permissions-Policy. Отключить всё, что сайт не использует (камера, микрофон, геолокация).
  3. CSP в Report-Only режиме. Собирать отчёты о нарушениях 1–2 недели.
  4. CSP в enforcing режиме. После устранения легитимных нарушений из отчётов.

Проверь себя

  1. Какой заголовок защищает от MIME-снифинга?
  2. Зачем нужен Permissions-Policy?
  3. Почему CSP рекомендуется внедрять последним?
<details> <summary>Ответы</summary>
  1. X-Content-Type-Options: nosniff. Запрещает браузеру угадывать MIME-тип, предотвращая выполнение текстовых файлов как скриптов.
  2. Чтобы запретить доступ к API браузера (камера, микрофон, геолокация) даже для самого сайта или встроенных iframe. Защита от использования API вредоносным скриптом.
  3. CSP — самый сложный заголовок. Без отладки в Report-Only режиме можно легко сломать легитимный функционал (заблокировать нужные скрипты, стили, шрифты).
</details>

Что унести с урока

  • Минимальный набор для каждого сайта: HSTS, CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy.
  • Permissions-Policy ограничивает доступ к Web API (камера, микрофон).
  • CSP внедряется через Report-Only → отладка → Enforce.
  • securityheaders.com и curl -I — быстрая проверка заголовков сайта.

Модуль «Безопасность в вебе» завершён. Мы разобрали CORS, CSP, XSS, CSRF и security-заголовки. Впереди последний модуль — Инструменты: как применять всё изученное на практике с curl, DevTools, диагностикой сети и написанием health-check скриптов.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике