Gli header di sicurezza sono istruzioni che il server invia con ogni pagina: “usa solo HTTPS”, “non indovinare il tipo di file”, “non farti incorniciare da altri siti”. Li applica il browser. Non correggono codice vulnerabile, ma riducono ciò che un attaccante può farne, e costano poche righe di configurazione. Eppure un controllo rapido sulla maggior parte dei siti piccoli mostra un elenco vuoto.
Gli header che contano
- Strict-Transport-Security (HSTS): il browser usa solo HTTPS per il dominio per un periodo stabilito. Impedisce downgrade e intercettazione dei cookie su reti ostili. Parti da
max-age=31536000; includeSubDomains. - Content-Security-Policy (CSP): elenca da dove possono essere caricati script, stili, immagini e frame. È la difesa più forte contro il cross-site scripting, e l'unica che richiede lavoro vero.
- X-Content-Type-Options: nosniff: il browser si fida del tipo dichiarato invece di indovinarlo, chiudendo una classe di attacchi basati su upload.
- X-Frame-Options o CSP
frame-ancestors: impedisce ad altri siti di incorporare il tuo in un frame (clickjacking). - Referrer-Policy: controlla quanta parte dell'URL arriva ad altri siti.
strict-origin-when-cross-originè un buon default. - Permissions-Policy: disattiva le funzioni del browser che non usi, come fotocamera, microfono o posizione.
- Cross-Origin-Opener-Policy: isola la tua finestra dai popup aperti da altre origini.
Un set base per nginx
È molto vicino a quello in uso su questo sito. Va nel blocco server (o in un file incluso):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; frame-ancestors 'self'" always;
server_tokens off;
Poi verifica e ricarica: nginx -t && systemctl reload nginx.
Due errori che rompono i siti
1. add_header sparisce nei blocchi annidati
In nginx, appena un blocco location contiene un proprio add_header, smette di ereditare quelli del blocco server. Un header di cache in una location può togliere in silenzio tutti gli header di sicurezza lì. Metti gli header in un file incluso e ripeti l'include dove una location imposta header propri. Prova sempre un file statico e un URL PHP o proxy, non solo la home.
2. Una CSP troppo severa, attivata tutta insieme
La CSP qui sopra è volutamente piccola. Un sito reale spesso carica font, statistiche o script inline, e una policy severa li blocca. Introducila in due passi:
- Invia prima
Content-Security-Policy-Report-Only. Non si rompe nulla, ma la console del browser elenca ciò che sarebbe stato bloccato. - Correggi o autorizza quanto trovato, poi passa all'header che impone la regola.
Evita 'unsafe-inline' in script-src: toglie gran parte della protezione. Con un solo script inline, autorizzalo con il suo hash ('sha256-…').
Togli ciò che rivela informazioni
server_tokens off; nasconde la versione di nginx. Controlla anche X-Powered-By di PHP o del pannello di hosting: dice agli attaccanti quale software colpire, ed è facile da trascurare perché viene aggiunto in un livello diverso dagli altri header.
Testalo
Da terminale:
curl -sI https://example.com/ | grep -iE 'strict|content-security|x-frame|x-content|referrer|permissions|cross-origin|x-powered|server'
Oppure incolla l'indirizzo nel controllo header di sicurezza gratuito: segue i redirect, assegna un voto da A a F e indica quale header manca o è troppo debole. Senza registrazione, non salva nulla.
Un ordine sensato
- HSTS, nosniff, Referrer-Policy, Permissions-Policy: innocui su quasi ogni sito, falli subito.
- Protezione dai frame:
SAMEORIGIN, salvo incorporamenti voluti altrove. - CSP prima in modalità report-only, poi con applicazione.
- Ripeti il test dopo ogni modifica a proxy, pannello o CDN, perché ogni livello può aggiungere o togliere header.
Gli header non sostituiscono le patch. Le segnalazioni correnti sono negli ultimi articoli; questi header sono il livello economico che rende meno doloroso il prossimo incidente.