Header di sicurezza HTTP: cosa sono e come configurarli
A cosa servono HSTS, CSP, X-Frame-Options e X-Content-Type-Options, con valori di partenza e configurazioni pronte da copiare.
Ultimo aggiornamento: · Hyperion S.r.l.
Che cosa sono
Gli header di sicurezza HTTP sono istruzioni che il server invia al browser insieme a ogni pagina. Attivano protezioni che il browser applica solo se il sito le chiede: usare sempre HTTPS, non caricare la pagina dentro siti di terzi, eseguire solo gli script autorizzati. Si configurano sul server, senza modificare l'applicazione, e sono tra i problemi più frequenti nelle scansioni di sicurezza.
I quattro header principali
| Header | Da cosa protegge | Valore consigliato di partenza |
|---|---|---|
| Strict-Transport-Security (HSTS) | Intercettazione della connessione: obbliga il browser a usare solo HTTPS | max-age=31536000; includeSubDomains |
| Content-Security-Policy (CSP) | Cross-site scripting e iniezione di contenuti: decide da dove si possono caricare script e risorse | default-src 'self'; object-src 'none'; frame-ancestors 'self'; base-uri 'self', prima in modalità report-only |
| X-Frame-Options | Clickjacking: impedisce di caricare la pagina in un iframe di un altro sito | SAMEORIGIN oppure DENY (o la direttiva CSP frame-ancestors) |
| X-Content-Type-Options | MIME sniffing: impedisce al browser di interpretare un file con un tipo diverso da quello dichiarato | nosniff |
Due header utili in aggiunta: Referrer-Policy: strict-origin-when-cross-origin, che limita le informazioni inviate ad altri siti quando l'utente clicca un link, e Permissions-Policy, che disattiva le funzioni del browser che il sito non usa, per esempio camera=(), microphone=(), geolocation=(). Conviene invece togliere X-Powered-By, che rivela tecnologia e versione del server.
Come attivarli
nginx
# nel blocco server { } del sito in HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; frame-ancestors 'self'; base-uri 'self'" always;
Attenzione: in nginx un blocco location che contiene a sua volta un add_header non eredita quelli del blocco server. Se usi add_header anche nei location, ripeti lì gli header di sicurezza.
Apache
# nel VirtualHost HTTPS o nel file .htaccess (richiede mod_headers)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; frame-ancestors 'self'; base-uri 'self'"
Node.js con Express
// npm install helmet
import helmet from "helmet";
app.use(helmet()); // HSTS, CSP di base, nosniff, frame-ancestors; rimuove X-Powered-By
Sulle piattaforme gestite (hosting condivisi, CDN, servizi cloud) gli header si impostano di solito dal pannello o da un file di configurazione dedicato: cerca la voce "custom headers" o "intestazioni personalizzate".
Errori da evitare
- Attivare HSTS prima che tutto il sito funzioni in HTTPS. Il browser rifiuterà HTTP per tutta la durata di
max-age: verifica prima ogni sottodominio, se usiincludeSubDomains. L'opzionepreloadva aggiunta solo dopo aver letto i requisiti su hstspreload.org, perché è difficile da annullare. - Imporre subito una CSP restrittiva. Blocca script, font o servizi esterni che il sito usa davvero. Parti con
Content-Security-Policy-Report-Only, controlla nella console del browser cosa verrebbe bloccato, aggiungi le origini necessarie e solo dopo passa aContent-Security-Policy. - Impostare gli header solo su alcune risposte. Usa
alwaysin nginx e Apache, così valgono anche per le pagine di errore e i redirect.
Come verificarli
Da un terminale: curl -sI https://tuosito.it mostra gli header restituiti dal server. Oppure avvia un Quick Check: il report elenca gli header presenti e mancanti, con il punteggio CVSS e l'istruzione per correggere ogni problema.
Fonti
- OWASP Secure Headers Project
- MDN Web Docs: HTTP headers (in inglese)
- OWASP HTTP Security Response Headers Cheat Sheet
Domande frequenti
Gli header di sicurezza rallentano il sito?
No. Sono poche righe di testo aggiunte alla risposta del server e non hanno effetti misurabili sulla velocità.
Quali header sono più importanti?
Strict-Transport-Security e Content-Security-Policy sono quelli con l'impatto maggiore; X-Frame-Options e X-Content-Type-Options sono semplici da attivare e vanno messi comunque.
Basta un plugin per attivarli?
Spesso sì, ma è preferibile impostarli sul server o sul servizio di hosting, perché così valgono per tutte le risposte, comprese immagini, file e pagine di errore.