Какие заголовки безопасности стоит выставлять в HTTP-ответах?
HTTP и HTTPS
Заголовки безопасности включают встроенные защиты браузера: только HTTPS, запрет чужих скриптов, запрет встраивания в iframe. Уязвимости они не исправляют, но резко сужают поле атаки.
Базовый набор
Strict-Transport-Security: max-age=31536000; includeSubDomains— только HTTPS, защита от SSL stripping. Первый визит не защищён — для него есть preload-список и директиваpreload.Content-Security-Policy— откуда грузить скрипты, стили, картинки; главный барьер против XSS, блокирует inline-скрипты без nonce или хеша.X-Content-Type-Options: nosniff— запрет угадывать MIME: загруженный «текст» не исполнится как скрипт.frame-ancestors 'none'в CSP или старыйX-Frame-Options: DENY— защита от clickjacking.Referrer-Policy: strict-origin-when-cross-origin— пути и query не утекают в Referer.Permissions-Policy— отключает камеру, геолокацию и прочие API.
Внедрение CSP
- Начать с
Content-Security-Policy-Report-Onlyи собрать нарушения. - Перейти на случайный nonce на каждый ответ:
script-src 'nonce-…' 'strict-dynamic'. - Избегать
'unsafe-inline'и'unsafe-eval'— они обнуляют смысл политики.
Типичные ошибки
- HSTS с includeSubDomains, пока какой-то поддомен ещё на HTTP, — он станет недоступен на весь max-age.
- Надежда на
X-XSS-Protection: современные браузеры его игнорируют.
Коротко для собеседования
Эти заголовки — дешёвый слой защиты в глубину: HSTS, CSP, nosniff и запрет фреймов закрывают целые классы атак. CSP внедряют через Report-Only, статичные заголовки удобно ставить на прокси, а главная ошибка — unsafe-inline, обнуляющий CSP.