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.com
  • img-src * data: — изображения откуда угодно + data URI
  • connect-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 для проверки заголовков

Связанные темы

Ресурсы