HTTP Security Headers: полный список
HTTP security headers — это заголовки ответа сервера, которые инструктируют браузер как обрабатывать контент: запрещать iframe, требовать HTTPS, ограничивать источники скриптов, предотвращать MIME-sniffing.
Зачем нужно
Большинство XSS, clickjacking, MIME-sniffing и protocol downgrade атак предотвращаются корректными HTTP-заголовками. Без них браузер слишком доверяет серверу и выполняет потенциально опасный контент. Helmet устанавливает эти заголовки автоматически, но понимание их значений помогает при тонкой настройке.
Где используется
- Любой HTTP-сервер, веб-приложение или API
- Аудит безопасности (securityheaders.com)
- Nginx/Express конфигурация production-серверов
Основной контент
Content-Security-Policy (CSP)
Content-Security-Policy: default-src 'self'; script-src 'self' cdn.js.com; img-src *
Директивы:
default-src 'self'— только с текущего доменаscript-src 'self' 'unsafe-inline'— скрипты + inline (плохо)style-src 'self' fonts.googleapis.comimg-src * data:— изображения откуда угодно + data URIconnect-src 'self' api.example.com— fetch/XHR только на эти доменыframe-ancestors 'none'— запретить iframe (аналог X-Frame-Options)
// В Express (Helmet)
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "cdn.example.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https:"],
}
}));
Strict-Transport-Security (HSTS)
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Принудительно использовать HTTPS на год. includeSubDomains — для поддоменов. preload — включить в HSTS preload list браузеров.
X-Frame-Options
X-Frame-Options: DENY # нельзя встраивать в iframe
X-Frame-Options: SAMEORIGIN # только со своего домена
Устарел в пользу CSP frame-ancestors, но всё ещё поддерживается.
X-Content-Type-Options
X-Content-Type-Options: nosniff
Запрещает браузеру угадывать MIME-тип файла (MIME sniffing). Без этого файл image.gif с JavaScript-кодом может выполниться как скрипт.
Referrer-Policy
Referrer-Policy: no-referrer # не отправлять Referer
Referrer-Policy: same-origin # только для своего домена
Referrer-Policy: strict-origin-when-cross-origin # default (рекомендуется)
Permissions-Policy (Feature-Policy)
Permissions-Policy: camera=, microphone=, geolocation=
Запрещает использование браузерных API (камера, микрофон, геолокация).
Cross-Origin заголовки
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Resource-Policy: same-site
Изолируют контекст вкладки (нужно для SharedArrayBuffer).
Helmet — все заголовки одной строкой
const helmet = require('helmet');
app.use(helmet); // устанавливает все перечисленные заголовки
// Что устанавливает helmet по умолчанию:
// Content-Security-Policy: default-src 'self';...
// Cross-Origin-Embedder-Policy: require-corp
// Cross-Origin-Opener-Policy: same-origin
// Cross-Origin-Resource-Policy: same-origin
// Origin-Agent-Cluster: ?1
// Referrer-Policy: no-referrer
// Strict-Transport-Security: max-age=15552000; includeSubDomains
// X-Content-Type-Options: nosniff
// X-DNS-Prefetch-Control: off
// X-Download-Options: noopen
// X-Frame-Options: SAMEORIGIN
// X-Permitted-Cross-Domain-Policies: none
// X-XSS-Protection: 0
Проверка заголовков
# curl показывает заголовки ответа
curl -I https://example.com
# Онлайн инструмент
# https://securityheaders.com
Частые ошибки
- CSP
unsafe-inline— разрешает inline-скрипты и сводит защиту от XSS к нулю; использовать nonce - Нет HSTS — пользователи могут зайти по HTTP и быть подвержены downgrade атаке
- X-XSS-Protection: 1 — устаревший заголовок с уязвимостями; Helmet по умолчанию ставит
0(отключить) - Тестировать только в браузере — использовать
curl -Iили securityheaders.com для проверки заголовков
Связанные темы
- _MOC Node.js
- Node.js -- безопасность (Helmet, rate-limit)
- HTTP-заголовки -- основные
- Path Traversal
- _MOC Сеть