Odpowiednia konfiguracja nagłówków HTTP to pierwsza linia obrony przed wieloma atakami na strony internetowe. Chronią użytkowników przed XSS, clickjackingiem, man-in-the-middle i innymi zagrożeniami. Ten przewodnik przedstawia wszystkie kluczowe nagłówki bezpieczeństwa wraz z konfiguracją dla różnych serwerów.

Dlaczego nagłówki bezpieczeństwa są ważne?

  • Chronią przed atakami XSS, clickjacking, MIME sniffing
  • Wymuszają połączenie HTTPS
  • Kontrolują dostęp do funkcji przeglądarki
  • Są sprawdzane przez audyty bezpieczeństwa
  • Wpływają na ocenę w narzędziach jak SecurityHeaders.com

1. Strict-Transport-Security (HSTS)

HSTS wymusza połączenie HTTPS dla wszystkich żądań, eliminując możliwość ataku man-in-the-middle.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Parametry

ParametrZnaczenie
max-ageCzas ważności w sekundach (31536000 = 1 rok)
includeSubDomainsStosuj dla wszystkich subdomen
preloadPozwól na dodanie do preload list przeglądarek

HSTS Preload List

Dodanie do HSTS Preload List oznacza, że przeglądarki będą wymuszać HTTPS nawet przy pierwszej wizycie. Wymagania:

  • Ważny certyfikat SSL
  • Przekierowanie HTTP → HTTPS
  • HSTS z max-age minimum 1 rok
  • Dyrektywy includeSubDomains i preload

Uwaga: HSTS jest nieodwracalny przez czas max-age. Zacznij od krótkiego okresu (np. 300 sekund) i stopniowo zwiększaj.

2. Content-Security-Policy (CSP)

CSP definiuje dozwolone źródła dla skryptów, stylów, obrazów i innych zasobów. To najważniejszy nagłówek ochrony przed XSS.

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'

Główne dyrektywy

DyrektywaKontroluje
default-srcDomyślne źródło dla wszystkich typów
script-srcSkrypty JavaScript
style-srcStyle CSS
img-srcObrazy
font-srcFonty
connect-srcXHR, fetch, WebSocket
frame-srcŹródła dla iframe
frame-ancestorsKto może osadzić stronę w iframe

Tryb Report-Only

Testuj CSP bez blokowania:

Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report

Szczegółowy przewodnik: CSP dla Google Services

3. X-Frame-Options

X-Frame-Options chroni przed atakami clickjacking, kontrolując czy strona może być osadzona w iframe.

X-Frame-Options: SAMEORIGIN

Wartości

WartośćZnaczenie
DENYNigdy nie pozwól na iframe
SAMEORIGINTylko z tej samej domeny
ALLOW-FROM uriTylko z określonego źródła (przestarzałe)

Uwaga: CSP frame-ancestors jest nowszą alternatywą. Użyj obu dla kompatybilności wstecznej.

4. X-Content-Type-Options

X-Content-Type-Options zapobiega “MIME sniffing” - próbom przeglądarki odgadnięcia typu pliku.

X-Content-Type-Options: nosniff

Bez tego nagłówka przeglądarka może zinterpretować plik tekstowy jako JavaScript, co umożliwia atak XSS.

5. Referrer-Policy

Referrer-Policy kontroluje jakie informacje o źródle są wysyłane przy nawigacji.

Referrer-Policy: strict-origin-when-cross-origin

Wartości

WartośćZnaczenie
no-referrerNigdy nie wysyłaj referrera
same-originTylko dla tej samej domeny
strict-originTylko domena, nie przy downgrade HTTPS→HTTP
strict-origin-when-cross-originPełny URL dla same-origin, domena dla cross-origin (rekomendowane)

6. Permissions-Policy

Permissions-Policy (dawniej Feature-Policy) kontroluje dostęp do funkcji przeglądarki jak geolokalizacja, kamera czy mikrofon.

Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=()

Składnia

  • () - zablokowane dla wszystkich
  • (self) - tylko ta domena
  • * - dozwolone dla wszystkich

Popularne funkcje

FunkcjaKontroluje
geolocationAPI geolokalizacji
microphoneDostęp do mikrofonu
cameraDostęp do kamery
paymentPayment Request API
fullscreenFullscreen API

7. X-XSS-Protection (przestarzały)

X-XSS-Protection aktywował wbudowany filtr XSS w starszych przeglądarkach. Jest przestarzały - współczesne przeglądarki (Chrome 78+) usunęły ten filtr.

X-XSS-Protection: 0

Dlaczego 0? Wartość 1; mode=block może powodować side-channel attacks. Użyj CSP zamiast tego nagłówka.

Kompletna konfiguracja

Apache (.htaccess)

<IfModule mod_headers.c>
    # HSTS - wymuszenie HTTPS
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    # CSP - dostosuj do swoich potrzeb
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; frame-ancestors 'self'"

    # Ochrona przed clickjackingiem
    Header always set X-Frame-Options "SAMEORIGIN"

    # Zapobieganie MIME sniffing
    Header always set X-Content-Type-Options "nosniff"

    # Kontrola referrera
    Header always set Referrer-Policy "strict-origin-when-cross-origin"

    # Ograniczenie API przeglądarki
    Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"

    # Wyłączenie przestarzałego filtra XSS
    Header always set X-XSS-Protection "0"
</IfModule>

Nginx

server {
    # HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # CSP
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'" always;

    # Clickjacking
    add_header X-Frame-Options "SAMEORIGIN" always;

    # MIME sniffing
    add_header X-Content-Type-Options "nosniff" always;

    # Referrer
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # Permissions
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

    # XSS filter disabled
    add_header X-XSS-Protection "0" always;
}

Node.js (Express + Helmet)

const helmet = require('helmet');

app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      imgSrc: ["'self'", "data:", "https:"],
      frameAncestors: ["'self'"]
    }
  },
  hsts: {
    maxAge: 31536000,
    includeSubDomains: true,
    preload: true
  },
  frameguard: { action: 'sameorigin' },
  noSniff: true,
  referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
  xssFilter: false
}));

Netlify (netlify.toml)

[[headers]]
  for = "/*"
  [headers.values]
    Strict-Transport-Security = "max-age=31536000; includeSubDomains; preload"
    X-Frame-Options = "SAMEORIGIN"
    X-Content-Type-Options = "nosniff"
    Referrer-Policy = "strict-origin-when-cross-origin"
    Permissions-Policy = "geolocation=(), microphone=(), camera=()"

Vercel (vercel.json)

{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains; preload" },
        { "key": "X-Frame-Options", "value": "SAMEORIGIN" },
        { "key": "X-Content-Type-Options", "value": "nosniff" },
        { "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
      ]
    }
  ]
}

Testowanie nagłówków

SecurityHeaders.com

https://securityheaders.com/ - szybki skan z oceną A-F.

Observatory by Mozilla

https://observatory.mozilla.org/ - kompleksowy audyt bezpieczeństwa.

Chrome DevTools

  1. Otwórz DevTools (F12)
  2. Zakładka Network
  3. Wybierz dokument HTML
  4. Sprawdź Response Headers

curl

curl -I https://example.com

Checklist bezpieczeństwa

Krytyczne

  • HSTS - wymuszenie HTTPS
  • X-Frame-Options - ochrona przed clickjacking
  • X-Content-Type-Options: nosniff

Rekomendowane

  • CSP - ochrona przed XSS
  • Referrer-Policy - kontrola informacji o źródle
  • Permissions-Policy - ograniczenie API przeglądarki

Przestarzałe (wyłącz)

  • X-XSS-Protection: 0 - wyłączenie legacy filtra

Podsumowanie

Konfiguracja nagłówków bezpieczeństwa to prosty krok, który znacząco podnosi poziom ochrony strony:

  1. HSTS wymusza HTTPS i chroni przed downgrade attacks
  2. CSP to najpotężniejsza ochrona przed XSS
  3. X-Frame-Options blokuje clickjacking
  4. Testuj regularnie na SecurityHeaders.com i Observatory

Dobrze skonfigurowane nagłówki mogą zapobiec wielu atakom przy minimalnym nakładzie pracy.

Źródła

  1. MDN - HTTP Security Headers https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security

  2. OWASP - Security Headers https://owasp.org/www-project-secure-headers/

  3. SecurityHeaders.com https://securityheaders.com/

  4. Mozilla Observatory https://observatory.mozilla.org/

  5. HSTS Preload List https://hstspreload.org/