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-заголовки лучше поэтапно, от простого к сложному:
- Минимальный набор (каждому сайту): HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy. Эти заголовки безопасны и не могут ничего сломать.
- Permissions-Policy. Отключить всё, что сайт не использует (камера, микрофон, геолокация).
- CSP в Report-Only режиме. Собирать отчёты о нарушениях 1–2 недели.
- CSP в enforcing режиме. После устранения легитимных нарушений из отчётов.
Проверь себя
- Какой заголовок защищает от MIME-снифинга?
- Зачем нужен Permissions-Policy?
- Почему CSP рекомендуется внедрять последним?
X-Content-Type-Options: nosniff. Запрещает браузеру угадывать MIME-тип, предотвращая выполнение текстовых файлов как скриптов.- Чтобы запретить доступ к API браузера (камера, микрофон, геолокация) даже для самого сайта или встроенных iframe. Защита от использования API вредоносным скриптом.
- CSP — самый сложный заголовок. Без отладки в Report-Only режиме можно легко сломать легитимный функционал (заблокировать нужные скрипты, стили, шрифты).
Что унести с урока
- Минимальный набор для каждого сайта: 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 скриптов.