Заголовки безопасности: CSP, HSTS, X-Frame-Options и другие
проверку HTTP-заголовков безопасности — это первая линия защиты вашего сайта от распространённых веб-атак: XSS, clickjacking, MIME-sniffing и перехвата трафика. Правильная настройка занимает минуты, а защищает от большинства атак из OWASP Top 10.
Content-Security-Policy (CSP)
Самый мощный заголовок безопасности. CSP контролирует, откуда браузер может загружать ресурсы — скрипты, стили, шрифты, изображения, фреймы и другие:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; frame-ancestors 'none'
Основные директивы CSP
| Директива | Что контролирует |
|---|---|
default-src | Источник по умолчанию для всех типов ресурсов |
script-src | Откуда можно загружать JavaScript |
style-src | Откуда можно загружать CSS |
img-src | Откуда можно загружать изображения |
font-src | Откуда можно загружать шрифты |
connect-src | Куда можно отправлять AJAX/Fetch/WebSocket запросы |
frame-src | Откуда можно загружать iframe |
frame-ancestors | Кто может встраивать вашу страницу в iframe |
base-uri | Допустимые URL для тега <base> |
form-action | Куда разрешено отправлять формы |
Значения источников
'self'— только текущий домен'none'— запрещено полностью'unsafe-inline'— разрешены инлайн-скрипты/стили (снижает защиту)'unsafe-eval'— разрешён eval() (опасно)'nonce-abc123'— разрешены элементы с указанным nonce'strict-dynamic'— скрипты, загруженные доверенными скриптами, тоже доверенныеhttps:— любой SSL/TLS проверку источникhttps://cdn.example.com— конкретный домен
Режим отчётов
Начните с режима отчётов, чтобы не сломать сайт:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Браузер будет логировать нарушения, но не блокировать ресурсы.
Strict-Transport-Security (HSTS)
Заставляет браузер всегда использовать HTTPS для вашего домена, даже если пользователь набрал http://:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age=63072000— запоминать на 2 года (в секундах)includeSubDomains— применять ко всем поддоменамpreload— включить в предзагрузочный список браузеров (hstspreload.org)
Важно: перед включением HSTS убедитесь, что весь сайт работает по HTTPS. После включения откатить будет сложно — браузеры запомнят директиву.
X-Frame-Options
Защищает от clickjacking — атаки, когда ваш сайт встраивают в невидимый iframe:
X-Frame-Options: DENY
| Значение | Описание |
|---|---|
DENY | Полный запрет встраивания в iframe |
SAMEORIGIN | Разрешено только с того же домена |
ALLOW-FROM uri | Разрешено с указанного URL (устарело, не поддерживается в Chrome) |
Современная замена — CSP директива frame-ancestors.
X-Content-Type-Options
Запрещает браузеру «угадывать» MIME-тип содержимого (MIME-sniffing):
X-Content-Type-Options: nosniff
Без этого заголовка браузер может интерпретировать текстовый файл как JavaScript и выполнить его — классический вектор XSS-атаки.
Referrer-Policy
Контролирует, какая информация передаётся в заголовке Referer при переходе на другие сайты:
Referrer-Policy: strict-origin-when-cross-origin
| Значение | Описание |
|---|---|
no-referrer | Referer не передаётся вообще |
origin | Передаётся только домен (без пути) |
strict-origin-when-cross-origin | Полный URL для своего домена, только домен для других (рекомендуется) |
same-origin | Referer только для запросов к своему домену |
no-referrer-when-downgrade | Не передавать при переходе с HTTPS на HTTP |
Permissions-Policy
Контролирует доступ к API документацию браузера — камера, микрофон, IP геолокацию, полноэкранный режим и другие:
Permissions-Policy: camera=(), microphone=(), geolocation=(self), fullscreen=(self)
Пустые скобки () полностью запрещают функцию. (self) разрешает только для текущего домена.
X-XSS-Protection
Активирует встроенный XSS-фильтр браузера (устаревший, но полезен для старых версий IE):
X-XSS-Protection: 1; mode=block
Современные браузеры полагаются на CSP вместо этого заголовка, но его стоит включить для обратной совместимости.
Рекомендуемый набор заголовков
Минимальный набор заголовков безопасности для любого сайта:
# Nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" 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'" always;
# Apache (.htaccess)
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"
Как проверить заголовки безопасности
Используйте наш инструмент для проверки HTTP заголовков — он покажет все заголовки ответа вашего сайта, включая заголовки безопасности, и поможет выявить отсутствующие:
Проверьте ваш сайт прямо сейчас
Проверить →