Voto degli header di sicurezza

Sei brevi righe nella risposta di un server dicono al browser quanto essere prudente con la tua pagina. Questo controllo le legge, le valuta su 100 e scrive per te quelle che mancano.

Oppure prova github.com, wikipedia.org

Gli header sono istruzioni, non contenuto

Ogni volta che un browser chiede una pagina, il server risponde in due parti. La seconda parte è la pagina stessa. La prima è un elenco di header, brevi righe nome-valore che il visitatore non vede mai, come il tipo di file, per quanto tempo tenerlo in cache e quali cookie conservare.

Una manciata di queste righe sono istruzioni di sicurezza. Non rendono il tuo server più difficile da violare. Attivano protezioni che ogni browser moderno ha già integrate e che restano spente finché un sito non le chiede. Un sito che non ne invia nessuna funziona lo stesso. Sta solo lasciando nella scatola un’armatura gratuita.

I sei header valutati da questo controllo

HeaderPuntiCosa previene
Strict-Transport-Security25Che un visitatore venga riportato di nascosto a http:// non cifrato su un Wi-Fi ostile. Dopo la prima visita, il browser rifiuta HTTP semplice per il tuo dominio per tutto il tempo indicato da max-age.
Content-Security-Policy25Gli script iniettati. Pubblichi l’elenco dei luoghi da cui il codice può essere caricato e tutto il resto viene bloccato, anche se un aggressore riesce a infilare un tag <script> in un commento o in un campo di un modulo.
X-Frame-Options15Il clickjacking, in cui un altro sito carica il tuo in un frame invisibile e inganna le persone facendo premere i tuoi pulsanti. L’equivalente moderno è frame-ancestors dentro la CSP, che questo controllo accetta ugualmente.
X-Content-Type-Options15L’indovinare il tipo. Con nosniff, un file caricato come immagine non può essere eseguito come script perché il browser «pensava che sembrasse uno script».
Referrer-Policy10La fuga degli indirizzi completi delle pagine, compreso qualsiasi dato privato nell’URL, verso ogni sito a cui rimandi.
Permissions-Policy10Contenuti di terze parti incorporati che chiedono fotocamera, microfono o posizione a tuo nome.

I pesi seguono quanto danno previene ciascuno. I due header da 25 punti fermano gli attacchi che svuotano davvero gli account. Quelli da 10 punti riguardano privacy e buone maniere.

Come leggere il voto

Un header conta per intero solo quando il suo valore fa il suo lavoro. Tre situazioni danno un punteggio parziale:

  • HSTS più breve di sei mesi. Un max-age di un giorno va bene mentre fai dei test, ma protegge chi torna sul sito per un giorno solo.
  • Una CSP che consente 'unsafe-inline' o 'unsafe-eval' senza nonce né hash. È proprio la porta che la policy doveva chiudere.
  • Una CSP in modalità Report-Only. Osserva e segnala ma non blocca ancora nulla. È il primo passo giusto, purché tu non ti fermi lì.

Il controllo elenca anche ogni cookie impostato dalla pagina e se ha Secure, HttpOnly e SameSite. Questi flag non entrano nel punteggio, ma un cookie di sessione senza di essi annulla buona parte di ciò che ottengono gli header.

Una A qui significa che le protezioni lato browser sono attive per questa singola risposta. Non dice nulla su password, plugin o aggiornamenti del server. Pagine diverse dello stesso sito possono anche inviare header diversi, quindi testa le pagine che contano: login, checkout, account.

Dove aggiungerli

Gli header si impostano ovunque vengano prodotte le risposte, e vince il livello più vicino al visitatore:

Una CDN o un proxy (Cloudflare, Fastly, l’edge di un hosting)
Di solito una regola «response header» o «transform» nel pannello. Una sola regola copre tutto il sito, pagine in cache comprese.
Apache
Nel .htaccess o nel virtual host: Header always set X-Content-Type-Options "nosniff". La parola always lo applica anche alle pagine di errore.
nginx
add_header X-Content-Type-Options "nosniff" always; nel blocco server. Attenzione a una cosa: un add_header dentro un blocco location sostituisce quelli sopra di lui, non si aggiunge.
L’applicazione
Framework e plugin dei CMS possono inviare header, ma solo sulle pagine che generano. I file statici serviti direttamente dal server web ne resteranno senza.

Comincia dai quattro che non possono rompere nulla: nosniff, X-Frame-Options: SAMEORIGIN, una Referrer-Policy e una Permissions-Policy. Aggiungi HSTS quando ogni sottodominio funziona in HTTPS. Lascia la Content-Security-Policy per ultima e introducila prima in modalità report-only, perché una CSP sbagliata bloccherà i tuoi stessi script.

Domande frequenti

Aggiungere header di sicurezza può rompere il mio sito?

Quattro dei sei si possono aggiungere senza pensarci. I due che richiedono attenzione sono HSTS e Content-Security-Policy. HSTS vincola i visitatori a HTTPS per la durata che imposti, quindi se usi includeSubDomains ogni sottodominio deve già avere un certificato valido. Una CSP blocca tutto ciò che non è nel tuo elenco. Provala con Content-Security-Policy-Report-Only per una o due settimane prima di applicarla.

Gli header di sicurezza aiutano la SEO?

Non direttamente. I motori di ricerca non classificano le pagine in base ai loro header. HTTPS è un leggero segnale di ranking e HSTS fa sì che HTTPS resti. Ciò che guadagni davvero sono meno pagine violate, e un sito violato perde posizioni in fretta.

Perché X-XSS-Protection non è nell’elenco?

I browser hanno rimosso il filtro che controllava. Chrome l’ha abbandonato nel 2019 e Firefox non l’ha mai avuto. Il consiglio attuale è ometterlo o impostarlo a 0, e affidarsi invece a una Content-Security-Policy.

Quale max-age usare per HSTS?

Un anno (max-age=31536000) è l’obiettivo abituale e il minimo per le liste di preload dei browser. Comincia con qualche minuto, verifica che nulla si rompa, poi alzalo a gradini. Questo controllo dà il punteggio pieno da sei mesi in su.

Il mio sito è dietro Cloudflare. Di chi sono questi header?

Sono quelli che riceve il visitatore, e sono quelli che contano. Se il tuo server di origine imposta un header e la CDN lo rimuove o lo sovrascrive, il voto riflette la versione della CDN.