Salta al contenuto principale
Sistemi Attivi
WP Planet — WordPress Cloud & Managed Services
Torna al MagazineSicurezza

HTTP security headers WordPress: CSP, HSTS, X-Frame-Options e gli header che proteggono davvero

31 Ott 2026 — 09:30 8 min di lettura
HTTP security headers WordPress: CSP, HSTS, X-Frame-Options e gli header che proteggono davvero

Gli HTTP security headers sono l'ultima linea di difesa che molti siti WordPress non hanno. CSP protegge dal XSS, HSTS dal downgrade, X-Frame-Options dal clickjacking. Come configurarli a livello di server senza rompere il sito, e perché la CSP è l'header più potente e più pericoloso.

Gli HTTP security headers sono l'ultima linea di difesa del browser — e la maggior parte dei siti WordPress non li ha. Non perché siano difficili da configurare, ma perché nessuno ci pensa. I plugin di sicurezza non li gestiscono (lavorano a livello di PHP, non di server), e gli sviluppatori di temi non li configurano. Risultato: il sito è vulnerabile al clickjacking, al MIME sniffing, al downgrade HTTPS, e al XSS — tutte cose che un header di due righe nel .htaccess chiude.

Il primo header da attivare è HSTS — lo abbiamo trattato nell'articolo sul SSL, quindi non lo ripeto. Il secondo è X-Frame-Options, che impedisce al tuo sito di essere incorporato in un iframe di un altro sito (clickjacking). Il terzo è X-Content-Type-Options, che impedisce al browser di indovinare il MIME type dei file (MIME sniffing). Il quarto — il più potente e il più pericoloso — è Content-Security-Policy.

Gli header base (sicuri e senza rischi)

Gli header base si configurano in .htaccess su Apache o nel server block di Nginx. Sono sicuri perché non cambiano il comportamento del sito — aggiungono solo restrizioni che il browser rispetta:

.htaccess
# .htaccess — HTTP security headers base
<IfModule mod_headers.c>
    # Impedisci al browser di indovinare il MIME type
    Header always set X-Content-Type-Options "nosniff"

    # Impedisci al sito di essere incorporato in iframe (clickjacking)
    Header always set X-Frame-Options "SAMEORIGIN"

    # HSTS: forza HTTPS per 1 anno (aumenta gradualmente)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    # Referrer-Policy: invia solo l'origine, non il path completo
    Header always set Referrer-Policy "strict-origin-when-cross-origin"

    # Permissions-Policy: disabilita API non necessarie
    Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>
Nota: HSTS con includeSubDomains applica la policy a tutti i sottodomini. Se hai sottodomini che non supportano HTTPS (es. un sottodominio legacy su HTTP), non usare includeSubDomains o blocchi gli utenti fuori. Inizia con max-age=300 (5 minuti) per testare, poi aumenta a 31536000 (1 anno) quando sei sicuro.

Content-Security-Policy: l'header più potente e più pericoloso

La CSP è l'header di sicurezza più potente che esista — e il più facile con cui rompere un sito. Una CSP ben configurata previene il XSS (Cross-Site Scripting) bloccando l'esecuzione di script non autorizzati. Una CSP mal configurata rompe JavaScript, CSS, immagini, e tutto quello che il sito carica da fonti esterne. La regola: mai attivare una CSP in produzione senza prima testarla in Report-Only mode.

La CSP in modalità Report-Only non blocca nulla — registra le violazioni nella console del browser. La usi per capire cosa la CSP bloccherebbe prima di attivarla davvero:

.htaccess
# .htaccess — CSP in modalità Report-Only (test, non blocca)
<IfModule mod_headers.c>
    Header always set Content-Security-Policy-Report-Only \
        "default-src 'self'; \
         script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://www.google-analytics.com; \
         style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; \
         font-src 'self' https://fonts.gstatic.com data:; \
         img-src 'self' data: https: blob:; \
         connect-src 'self' https://www.google-analytics.com; \
         frame-src 'self' https://www.youtube.com; \
         object-src 'none'; \
         base-uri 'self'; \
         form-action 'self';"
</IfModule>

# Dopo aver testato e corretto le violazioni,
# cambia Report-Only in CSP attiva:
# Header always set Content-Security-Policy "..."
Nota: 'unsafe-inline' e 'unsafe-eval' riducono la protezione della CSP ma sono spesso necessari per WordPress (che usa script inline nel tema). L'obiettivo è rimuoverli gradualmente, non tenerli per sempre. Per un sito WordPress tipico, inizia con questa CSP e rimuovi 'unsafe-eval' quando hai rimosso tutti gli script inline.

La verifica: securityheaders.com e il test finale

Il modo più rapido di verificare i tuoi header è securityheaders.com — inserisci l'URL e ti restituisce un punteggio da F ad A+. Non è un punteggio SEO, è un punteggio di sicurezza del browser. Un sito con A+ è protetto da tutti gli attacchi che gli header possono fermare. Un sito con F è nudo. La maggior parte dei siti WordPress che vediamo ha F o D — non perché siano insicuri di base, ma perché non hanno configurato gli header.

Terminale
# Verifica gli header di sicurezza con curl
curl -sI https://www.example.com | grep -iE \
  'strict-transport-security|x-content-type|x-frame|content-security|referrer|permissions'

# Output atteso (se configurati):
# strict-transport-security: max-age=31536000; includeSubDomains
# x-content-type-options: nosniff
# x-frame-options: SAMEORIGIN
# content-security-policy: default-src 'self'; ...
# referrer-policy: strict-origin-when-cross-origin
# permissions-policy: geolocation=(), microphone=(), camera=()

# Test completo con securityheaders.com API
curl -s 'https://api.securityheaders.com/?q=https://www.example.com&followRedirects=on' | python -m json.tool
Nota: Se curl non mostra gli header, il problema è che mod_headers non è abilitato su Apache. Verifica con a2enmod headers e riavvia Apache. Su Nginx, gli header si aggiungono con add_header nel server block.

Gli HTTP security headers sono l'unico intervento di sicurezza che protegge il browser dell'utente — non il server. Il WAF protegge il server, il backup protegge i dati, ma gli header proteggono l'utente mentre naviga. E dato che l'utente è l'anello più debole (clickjacking, XSS, downgrade), gli header sono l'intervento con il ritorno più immediato per la sicurezza percepita e reale. Cinque righe di .htaccess, punteggio da F ad A+. Non c'è motivo di non farlo.

Audit di sicurezza

Verifica la sicurezza del tuo WordPress prima che diventi un'emergenza.

Un audit di sicurezza individua le falle, i plugin vulnerabili e le configurazioni deboli prima che qualcuno le sfrutti.

Audit di sicurezza
Condividi