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
| Parametr | Znaczenie |
|---|---|
max-age | Czas ważności w sekundach (31536000 = 1 rok) |
includeSubDomains | Stosuj dla wszystkich subdomen |
preload | Pozwó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-ageminimum 1 rok - Dyrektywy
includeSubDomainsipreload
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
| Dyrektywa | Kontroluje |
|---|---|
default-src | Domyślne źródło dla wszystkich typów |
script-src | Skrypty JavaScript |
style-src | Style CSS |
img-src | Obrazy |
font-src | Fonty |
connect-src | XHR, fetch, WebSocket |
frame-src | Źródła dla iframe |
frame-ancestors | Kto 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 |
|---|---|
DENY | Nigdy nie pozwól na iframe |
SAMEORIGIN | Tylko z tej samej domeny |
ALLOW-FROM uri | Tylko 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-referrer | Nigdy nie wysyłaj referrera |
same-origin | Tylko dla tej samej domeny |
strict-origin | Tylko domena, nie przy downgrade HTTPS→HTTP |
strict-origin-when-cross-origin | Peł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
| Funkcja | Kontroluje |
|---|---|
geolocation | API geolokalizacji |
microphone | Dostęp do mikrofonu |
camera | Dostęp do kamery |
payment | Payment Request API |
fullscreen | Fullscreen 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
- Otwórz DevTools (F12)
- Zakładka Network
- Wybierz dokument HTML
- 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:
- HSTS wymusza HTTPS i chroni przed downgrade attacks
- CSP to najpotężniejsza ochrona przed XSS
- X-Frame-Options blokuje clickjacking
- Testuj regularnie na SecurityHeaders.com i Observatory
Dobrze skonfigurowane nagłówki mogą zapobiec wielu atakom przy minimalnym nakładzie pracy.
Źródła
-
MDN - HTTP Security Headers https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security
-
OWASP - Security Headers https://owasp.org/www-project-secure-headers/
-
SecurityHeaders.com https://securityheaders.com/
-
Mozilla Observatory https://observatory.mozilla.org/
-
HSTS Preload List https://hstspreload.org/

