Gli header di sicurezza sono header di risposta HTTP che dicono ai browser di attivare funzioni di sicurezza integrate. La maggior parte dei siti WordPress per default manca di vari di questi header perché né il core di WordPress né la maggior parte dei provider di hosting li impostano automaticamente. La buona notizia è che aggiungerli richiede solo pochi minuti, e il miglioramento della sicurezza è significativo. Questa guida copre ogni header di sicurezza importante, spiega cosa fa ciascuno e mostra come aggiungerli tutti in una volta.
Quali header di sicurezza dovrebbe avere ogni sito WordPress?
Ecco la lista completa degli header di sicurezza consigliati con i loro valori e da cosa proteggono:
- X-Frame-Options: SAMEORIGIN: impedisce che il tuo sito venga caricato in un iframe su un altro dominio. Questo previene attacchi di clickjacking in cui un sito malevolo sovrappone pulsanti invisibili alla tua pagina.
- X-Content-Type-Options: nosniff: impedisce ai browser di indovinare il MIME type di un file. Senza questo, un aggressore potrebbe caricare un file che sembra un'immagine ma contiene JavaScript, e il browser potrebbe eseguirlo.
- Referrer-Policy: strict-origin-when-cross-origin: controlla quante informazioni URL vengono condivise quando gli utenti seguono link verso altri siti. Questa impostazione invia l'URL completo per richieste all'interno della stessa origin ma solo il dominio per richieste cross-origin, il che protegge parametri URL sensibili.
- Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(): disabilita funzionalità del browser che il tuo sito non usa. Le parentesi vuote significano "nessuno può usare questa funzionalità", il che impedisce a script malevoli di accedere a camera, microfono o posizione.
- Strict-Transport-Security: max-age=31536000; includeSubDomains: forza i browser a usare sempre HTTPS. Vedi la nostra guida HSTS dedicata per dettagli su un rollout sicuro.
- X-XSS-Protection: 1; mode=block: un header legacy per browser più vecchi che attiva il filtro XSS integrato. I browser moderni l'hanno dismesso a favore di CSP, ma includerlo per la compatibilità all'indietro non fa male.
- Content-Security-Policy: l'header di sicurezza più potente (e complesso). Vedi la nostra guida CSP dedicata per una spiegazione completa.
Come prioritizzare: quali header aggiungere per primi
Se aggiungi header di sicurezza per la prima volta, questo è l'ordine che ti dà il maggior miglioramento di sicurezza con il minor rischio:
- X-Content-Type-Options: zero rischio di rompere qualcosa. Aggiungilo e basta.
- X-Frame-Options: sicuro a meno che tu non incorpori intenzionalmente il tuo sito in iframe su altri domini (improbabile per la maggior parte dei siti WordPress).
- Referrer-Policy: rischio molto basso. Il valore consigliato
strict-origin-when-cross-originè già il comportamento default nei browser moderni. - Permissions-Policy: basso rischio a meno che il tuo sito non usi effettivamente le API di camera, microfono o geolocalizzazione.
- X-XSS-Protection: header legacy, nessun rischio.
- Strict-Transport-Security: richiede prima HTTPS funzionante. Segui un rollout graduale (vedi la nostra guida HSTS).
- Content-Security-Policy: massimo rischio di rompere cose su WordPress. Inizia sempre in modalità Report-Only (vedi la nostra guida CSP).
Aggiungere tutti gli header tramite Apache .htaccess
Questo è il metodo più comune per i siti WordPress su hosting condiviso. Apri il file .htaccess nella directory principale di WordPress e aggiungi il seguente blocco. Posizionalo prima della sezione # BEGIN WordPress per mantenere ordine:
<IfModule mod_headers.c>
# Prevent clickjacking
Header always set X-Frame-Options "SAMEORIGIN"
# Prevent MIME-type sniffing
Header always set X-Content-Type-Options "nosniff"
# Control referrer information
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Restrict browser features
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
# Force HTTPS (only add if SSL is fully working)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# XSS Protection for legacy browsers
Header always set X-XSS-Protection "1; mode=block"
</IfModule>Alcune cose da tenere a mente:
- Il wrapper
IfModuleassicura che Apache non dia un errore 500 semod_headersnon è abilitato sul tuo server. - Usare
Header always set(invece del soloHeader set) assicura che gli header vengano inviati in tutte le risposte, incluse le pagine di errore. - Se hai già un blocco
<IfModule mod_headers.c>nel tuo.htaccess, aggiungi le singole righeHeaderall'interno di quel blocco esistente invece di creare un blocco doppio.
Aggiungere tutti gli header tramite Nginx
Se il tuo sito WordPress gira su Nginx (comune negli host WordPress gestiti come Kinsta, Cloudways, GridPane o SpinupWP), aggiungi queste righe all'interno del tuo blocco server:
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-XSS-Protection "1; mode=block" always;Punti di attenzione specifici per Nginx:
- La parola chiave
alwaysinvia l'header per tutti i codici di risposta (inclusi 4xx e 5xx). Senza questo, Nginx invia gli header solo per le risposte 2xx. - Se hai un blocco
locationseparato che gestisce PHP (es.location ~ .php$), potrebbe essere necessario aggiungere gli header anche lì, a seconda della tua configurazione Nginx. Nginx non eredita le direttiveadd_headerdai blocchi padre se il blocco figlio ha il proprioadd_header. - Testa e ricarica sempre dopo le modifiche:
sudo nginx -t && sudo systemctl reload nginx.
Aggiungere header tramite PHP in WordPress
Se non hai accesso ai file di configurazione del server, puoi inviare gli header di sicurezza da PHP. Aggiungi questo a functions.php del tuo tema o a un plugin personalizzato specifico per il sito:
function iwp_add_security_headers() {
if ( is_admin() ) {
return;
}
header( 'X-Frame-Options: SAMEORIGIN' );
header( 'X-Content-Type-Options: nosniff' );
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
header( 'Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()' );
header( 'X-XSS-Protection: 1; mode=block' );
}
add_action( 'send_headers', 'iwp_add_security_headers' );Il controllo is_admin() salta l'area di amministrazione WordPress per evitare possibili conflitti con la funzionalità di amministrazione. Nota che questo approccio PHP ha una limitazione: si applica solo alle pagine elaborate da WordPress. I file statici (immagini, CSS, JS, font) serviti direttamente dal tuo web server non portano questi header. Per copertura completa, la configurazione a livello di server è sempre la scelta migliore.
Plugin WordPress per header di sicurezza
Se preferisci un approccio plugin, queste opzioni offrono un'interfaccia user-friendly per gestire gli header di sicurezza:
- HTTP Headers: un plugin gratuito con un'estesa UI per impostare tutti gli header di sicurezza. Supporta X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy e altro. Configuri tutto dall'area di amministrazione WordPress senza toccare file.
- Really Simple SSL Pro: la versione premium include un modulo per gli header di sicurezza con cui puoi attivare o disattivare i singoli header. Dà anche raccomandazioni e spiega ogni header.
- Headers Security Advanced & HSTS WP: un plugin mirato specificamente agli header di sicurezza. Copre tutti gli header principali e include preset per configurazioni comuni.
- Security Headers di Jeremykendall: un'opzione leggera che aggiunge tutti gli header consigliati con valori predefiniti significativi.
Sebbene i plugin siano comodi, hanno svantaggi. Se il plugin viene disattivato, aggiornato con un bug o rimosso, i tuoi header di sicurezza scompaiono immediatamente. Per i siti di produzione, la configurazione a livello di server è più affidabile, perché non dipende da WordPress o da un plugin attivo.
Testare i tuoi header con strumenti online
Dopo aver aggiunto gli header, verificali con questi strumenti gratuiti:
- securityheaders.com: inserisci il tuo URL e ricevi una valutazione da A+ a F insieme a una panoramica dettagliata di quali header sono presenti e quali mancano. Punta ad almeno una valutazione A.
- observatory.mozilla.org: lo strumento di Mozilla esegue un'analisi più estesa, inclusa la valutazione CSP e la sicurezza dei cookie.
- DevTools del browser: premi F12, vai alla scheda Network, clicca sulla richiesta del documento principale e scorri fino a Response Headers per vedere esattamente cosa invia il tuo server.
Puoi anche controllare dalla riga di comando:
curl -sI https://example.comQuesto mostra tutti gli header di risposta, inclusi gli header di sicurezza appena aggiunti.
Considerazioni su CDN e reverse proxy
Se il tuo sito WordPress è dietro un CDN come Cloudflare, Sucuri o Fastly, sii consapevole che il CDN può rimuovere header, sovrascriverli o aggiungere i suoi. Ecco cosa devi sapere:
- Cloudflare: per default non rimuove gli header di sicurezza, quindi gli header impostati sul tuo server di origine vengono passati. Cloudflare offre anche proprie impostazioni per header di sicurezza nel dashboard sotto SSL/TLS > Edge Certificates (per HSTS) e nelle managed rules.
- Sucuri: il loro firewall può aggiungere automaticamente alcuni header di sicurezza. Controlla le impostazioni nel tuo dashboard Sucuri per vedere quali sono attivi ed evitare duplicati.
- Fastly / KeyCDN / BunnyCDN: la maggior parte dei CDN consente di aggiungere header di risposta personalizzati nel loro pannello di configurazione. Può essere una buona alternativa se non puoi modificare la configurazione del server sulla tua origine.
Se vedi header duplicati nella tua risposta (es. due righe X-Frame-Options), può causare comportamento imprevedibile del browser. Assicurati che ogni header sia impostato solo in un posto: o sul tuo server di origine, o a livello CDN, non entrambi.
Errori comuni nell'aggiungere header di sicurezza
- Blocchi IfModule duplicati: se il tuo
.htaccessha già un blocco<IfModule mod_headers.c>(forse da un plugin), aggiungere un secondo può causare conflitti. Unisci i tuoi header nel blocco esistente. - Impostare gli header solo tramite PHP: questo manca tutti i file statici. Usa la configurazione a livello di server per copertura completa.
- Sovrascrivere gli header nei blocchi location (Nginx): se un blocco
locationfiglio ha anche solo unadd_header, sostituisce tutti gli header del blocco padre. Devi ripetere tutti gli header in ogni blocco location che definisce i propri. - Non testare dopo gli aggiornamenti dei plugin: un aggiornamento di plugin o un cambio di tema può rimuovere i tuoi header basati su PHP. Testa sempre di nuovo dopo modifiche importanti.
- Dimenticare i sottodomini: se hai sottodomini (staging, mail, ecc.), assicurati che anche questi abbiano configurati gli header di sicurezza. Gli aggressori spesso prendono di mira il sottodominio più debole.
Verifica i tuoi header di sicurezza con InspectWP
Dopo aver aggiunto tutti gli header, esegui una nuova scansione InspectWP sul tuo sito WordPress. La sezione sicurezza del tuo report elenca ogni header di sicurezza e mostra lo stato. Ogni header presente e configurato correttamente appare come verde. Gli header mancanti appaiono come rosso o giallo, a seconda della loro importanza. Usa la funzione report automatici di InspectWP per monitorare i tuoi header nel tempo e individuare regressioni dovute a modifiche del server o aggiornamenti dei plugin.