Заголовки безопасности: полный гайд
Зачем нужны заголовки безопасности
Заголовки безопасности HTTP — инструкции для браузера, определяющие правила безопасности при работе с вашим сайтом. Они защищают от XSS, clickjacking, MITM, инъекций и других атак. Настройка занимает минуты, а эффект — закрытие целых классов уязвимостей.
Проверьте текущие заголовки безопасности вашего сайта с помощью сканера безопасности Enterno.io.
Content-Security-Policy (CSP)
CSP — самый мощный заголовок безопасности. Он определяет, откуда могут загружаться ресурсы: скрипты, стили, изображения, шрифты, фреймы.
Базовая политика
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'
Ключевые директивы
default-src— политика по умолчанию для всех типов ресурсовscript-src— откуда можно загружать JavaScriptstyle-src— откуда можно загружать CSSimg-src— откуда можно загружать изображенияconnect-src— куда можно отправлять XHR/Fetch/WebSocket запросыframe-ancestors— кто может встраивать ваш сайт в iframebase-uri— ограничение<base>тегаform-action— куда могут отправляться формы
Рекомендации
- Начните с
Content-Security-Policy-Report-Only— он логирует нарушения без блокировки - Избегайте
'unsafe-inline'и'unsafe-eval'— они ослабляют защиту от XSS - Используйте nonce или hash для инлайн-скриптов:
script-src 'nonce-abc123'
Strict-Transport-Security (HSTS)
HSTS заставляет браузер использовать только SSL/TLS проверку для вашего домена. Даже если пользователь введёт http://, браузер автоматически переключится на HTTPS без HTTP-запроса.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age— время действия в секундах (рекомендуется 1 год = 31536000)includeSubDomains— распространяется на все поддоменыpreload— включает в HSTS preload list браузеров
Внимание: после включения preload откатить можно только через несколько месяцев. Начните с короткого max-age.
X-Frame-Options
Защищает от clickjacking — атаки, когда ваш сайт встраивается в невидимый iframe на вредоносной странице.
X-Frame-Options: DENY
DENY— запрет встраивания в iframe вездеSAMEORIGIN— разрешить встраивание только с того же домена
Современная замена: CSP frame-ancestors, но X-Frame-Options сохраняется для совместимости.
X-Content-Type-Options
Запрещает браузеру угадывать MIME-тип (MIME sniffing). Без этого заголовка браузер может интерпретировать загруженный файл как HTML/JavaScript, даже если сервер отправил его как текст.
X-Content-Type-Options: nosniff
Всегда устанавливайте. Нет причин не устанавливать.
Referrer-Policy
Контролирует, какая информация о реферере передаётся при навигации:
Referrer-Policy: strict-origin-when-cross-origin
no-referrer— никогда не передавать реферерsame-origin— только для запросов к тому же доменуstrict-origin-when-cross-origin— полный URL для same-origin, только домен для cross-origin, ничего при HTTPS→HTTP
Permissions-Policy
Контролирует доступ к API документацию браузера: камера, микрофон, IP геолокацию, автовоспроизведение и другие. Заменяет устаревший Feature-Policy.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self)
Пустые скобки () полностью запрещают функцию. (self) разрешает только для вашего домена.
Cross-Origin Headers
Cross-Origin-Opener-Policy (COOP)
Cross-Origin-Opener-Policy: same-origin
Изолирует контекст окна. Предотвращает атаки через window.opener из межсайтовых окон.
Cross-Origin-Resource-Policy (CORP)
Cross-Origin-Resource-Policy: same-origin
Запрещает другим сайтам загружать ваши ресурсы (защита от hot-linking и утечек данных).
Cross-Origin-Embedder-Policy (COEP)
Cross-Origin-Embedder-Policy: require-corp
Все загружаемые ресурсы должны явно разрешить межсайтовое использование. Требуется для SharedArrayBuffer и высокоточных таймеров.
Пример полной конфигурации nginx
add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; frame-ancestors 'none'" always;
Проверка заголовков
Используйте сканер безопасности Enterno.io для полной проверки заголовков безопасности. Также проверьте ответ через HTTP-чекер — он покажет все анализ заголовков ответа вашего сервера.
Итоги
Заголовки безопасности — обязательный минимум защиты любого сайта. Начните с HSTS, X-Content-Type-Options, X-Frame-Options и Referrer-Policy — они простые и безопасные. Затем добавьте CSP, начав с Report-Only режима. Permissions-Policy и Cross-Origin заголовки — для продвинутой защиты.
Проверьте ваш сайт прямо сейчас
Проверить →