Come aggiungere gli header di sicurezza HTTP in WordPress
Gli header di sicurezza HTTP sono istruzioni che il server invia al browser per proteggerlo da attacchi come cross-site scripting (XSS), clickjacking e iniezione di contenuti. WordPress non li imposta di default, lasciando il tuo sito vulnerabile. In questa guida ti spiego quali header aggiungere e come configurarli.
Perché gli header di sicurezza sono importanti
Ogni volta che un browser carica una pagina del tuo sito, riceve una serie di header HTTP nella risposta del server. Questi header possono dire al browser cosa è permesso e cosa no: da dove caricare risorse, se la pagina può essere incorporata in un iframe, quale policy seguire per i referrer. Senza questi header, il browser applica le sue impostazioni predefinite, che spesso sono troppo permissive. Strumenti come SecurityHeaders.com ti permettono di verificare quali header sono attivi sul tuo sito e ti danno un voto da A+ a F.
X-Content-Type-Options
L’header X-Content-Type-Options: nosniff impedisce al browser di interpretare un file con un tipo MIME diverso da quello dichiarato. Senza questo header, un browser potrebbe eseguire un file JavaScript mascherato da immagine, aprendo la porta a attacchi XSS. Questo header è semplice da aggiungere e non causa mai problemi di compatibilità.
X-Frame-Options
L’header X-Frame-Options: SAMEORIGIN impedisce che il tuo sito venga caricato all’interno di un iframe su un dominio diverso. Questo protegge dal clickjacking, un attacco in cui il tuo sito viene incorporato invisibilmente in un’altra pagina per ingannare gli utenti e farli cliccare su pulsanti senza saperlo. Usa SAMEORIGIN per permettere gli iframe solo dal tuo stesso dominio, o DENY per bloccarli completamente.
Strict-Transport-Security (HSTS)
L’header HSTS dice al browser di usare sempre HTTPS per il tuo dominio, anche se l’utente digita http://. Una volta che il browser riceve questo header, per la durata specificata non tenterà mai di connettersi via HTTP. La configurazione consigliata è:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Il valore max-age=31536000 imposta la durata a un anno. Aggiungi includeSubDomains solo se tutti i tuoi sotto-domini supportano HTTPS. Importante: attiva HSTS solo quando sei sicuro che SSL funziona correttamente sul tuo sito, altrimenti i visitatori non potranno accedervi.
Referrer-Policy
L’header Referrer-Policy controlla quante informazioni sul referrer vengono inviate quando un utente clicca un link dal tuo sito verso un sito esterno. Il valore consigliato è strict-origin-when-cross-origin: invia l’URL completo solo per le richieste interne al tuo dominio, mentre per le richieste esterne invia solo l’origine (es. https://tuodominio.com senza il percorso). Questo protegge la privacy dei tuoi utenti senza rompere la funzionalità.
Permissions-Policy
L’header Permissions-Policy (precedentemente chiamato Feature-Policy) controlla quali funzionalità del browser il tuo sito può utilizzare: fotocamera, microfono, geolocalizzazione, ecc. Se il tuo sito non usa queste funzionalità, disabilitale per impedire che script malevoli possano attivarle:
Permissions-Policy: camera=(), microphone=(), geolocation=()
Le parentesi vuote significano che nessuno, nemmeno il tuo sito stesso, può utilizzare quella funzionalità.
Come aggiungere gli header in WordPress
Ci sono tre metodi principali per aggiungere gli header di sicurezza al tuo sito WordPress:
Metodo 1: tramite .htaccess (Apache)
Se il tuo server usa Apache, aggiungi queste righe al file .htaccess nella root del sito:
<IfModule mod_headers.c> Header set X-Content-Type-Options "nosniff" Header set X-Frame-Options "SAMEORIGIN" Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header set Referrer-Policy "strict-origin-when-cross-origin" Header set Permissions-Policy "camera=(), microphone=(), geolocation=()" </IfModule>
Metodo 2: tramite Nginx
Se usi Nginx, aggiungi le stesse direttive nel blocco server della configurazione:
add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Il parametro always assicura che gli header vengano inviati anche per le risposte di errore (404, 500, ecc.).
Metodo 3: tramite plugin
Se non hai accesso ai file di configurazione del server, puoi usare un plugin come HTTP Headers o Headers Security Advanced & HSTS WP. Questi plugin aggiungono gli header tramite PHP, senza modificare .htaccess o Nginx.
Verificare che gli header siano attivi
Dopo aver configurato gli header, verifica che funzionino correttamente. Puoi usare il terminale:
curl -I https://tuodominio.com
Oppure visita SecurityHeaders.com e inserisci l’URL del tuo sito. Il servizio analizza gli header e ti assegna un voto. L’obiettivo è ottenere almeno un voto A.
Content-Security-Policy: l’header avanzato
L’header Content-Security-Policy (CSP) è il più potente ma anche il più complesso da configurare. Definisce da quali origini il browser può caricare script, stili, immagini e altre risorse. Una policy troppo restrittiva può rompere il tuo sito, mentre una troppo permissiva non protegge abbastanza.
Per iniziare, usa la modalità report-only che registra le violazioni senza bloccare nulla:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'unsafe-inline'
Monitora i report per alcune settimane, poi converti la policy in modalità di blocco effettivo. Se il tuo sito usa Google Analytics, font esterni o CDN per jQuery, dovrai aggiungere queste origini alla policy. La configurazione CSP richiede tempo e test accurati, ma è la protezione più efficace contro gli attacchi XSS.
Errori comuni da evitare
Quando configuri gli header di sicurezza, fai attenzione a questi errori frequenti:
- Attivare HSTS senza verificare SSL: se il tuo certificato SSL scade o ha problemi, i visitatori non potranno accedere al sito per l’intera durata del max-age.
- Duplicare gli header: se imposti gli header sia in .htaccess sia tramite plugin, il browser riceve valori duplicati che possono causare comportamenti imprevisti.
- Impostare X-Frame-Options su DENY con contenuti embed: se usi video incorporati o mappe da servizi esterni, DENY potrebbe bloccarli. Usa SAMEORIGIN in questi casi.
Serve assistenza?
Se vuoi migliorare la sicurezza del tuo sito WordPress con gli header HTTP corretti, il team di SoccorsoWP può configurarli per te senza rischiare di rompere il sito. Apri un ticket e proteggi il tuo sito oggi stesso.