bitlvl
IT

Analizzatore di header di sicurezza HTTP e CSP

Esegui curl -sI https://tuo.sito/ e incolla l’output, oppure incolla solo una CSP. Ogni header viene spiegato, gli header di sicurezza ricevono un voto con la soluzione per ogni mancanza, e la Content-Security-Policy viene controllata come la leggerebbe un attaccante. Questa pagina non scarica nulla; legge solo ciò che incolli.

Ottieni i tuoi con: curl -sI https://example.com/ (aggiungi -L per seguire i redirect)

I risultati e i messaggi di questo strumento sono mostrati in inglese.

Com’è fatto un buon insieme di header

strict-transport-security: max-age=31536000; includeSubDomains; preload
content-security-policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
x-content-type-options: nosniff
x-frame-options: DENY
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=(), payment=()
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin

È quello che invia questo sito. Per un’applicazione con script inline la CSP passa ai nonce: script-src 'nonce-<casuale per risposta>' 'strict-dynamic', che è sia più rigorosa sia più facile da mantenere di una lista di host.

Come ragiona la valutazione della CSP

Una CSP esiste per limitare ciò che un attaccante può fare una volta trovato un punto di iniezione. Quindi la valutazione chiede: data una stringa iniettata, gli script possono girare? 'unsafe-inline' senza nonce dice sì. Una wildcard o una sorgente a schema (*, https:, data:) dice sì. Un host che serve script scelti dall’attaccante (CDN pubbliche con vecchie versioni di AngularJS, endpoint JSONP su googleapis.com, bucket di storage) dice sì, ed è per questo che una lunga lista di CDN popolari è più debole di quanto sembri. object-src e base-uri mancanti sono le due direttive che si dimenticano e che riaprono la porta. Le direttive restanti (frame-ancestors, form-action, default-src) contano per clickjacking ed esfiltrazione di dati piuttosto che per l’esecuzione di script, quindi pesano meno.

Dove impostare gli header

  • nginx: add_header Nome "valore" always; — ricorda che un add_header dentro una location annulla tutti quelli a livello di server (prova con il tester di location nginx).
  • Apache: Header always set Nome "valore" nel vhost o in .htaccess (mod_headers).
  • Cloudflare: HSTS sotto SSL/TLS → Edge Certificates; gli altri header tramite Transform Rules → Modify Response Header, che funziona anche per origini che non puoi modificare.
  • Framework applicativi: helmet (Node), secure_headers (Rails), django-csp, middleware Laravel — generano anche i nonce per risposta.

Introdurre una CSP in sicurezza

  1. Inviala come Content-Security-Policy-Report-Only con un endpoint report-to e osserva i report per una settimana.
  2. Correggi le violazioni reali (handler inline, widget di terze parti), ignora il rumore delle estensioni del browser.
  3. Cambia il nome dell’header in Content-Security-Policy. Tieni la report-only per testare la modifica successiva.

Domande

Quali header contano di più?

Per un sito con qualsiasi interazione utente: prima Content-Security-Policy, poi Strict-Transport-Security e X-Content-Type-Options. Le policy di framing e referrer costano poco. Il resto è igiene: nascondere le versioni, flag sui cookie, eliminare gli header deprecati.

Perché la mia CSP è valutata debole anche se elenca solo host fidati?

Perché la fiducia non è la questione; la questione è se uno script su quegli host può essere indotto a eseguire codice dell’attaccante. Le CDN pubbliche ospitano migliaia di versioni di librerie, alcune con gadget noti (template AngularJS, callback JSONP). Una policy basata su nonce con strict-dynamic non ha questo problema, e questa pagina la valuta come la configurazione più forte.

X-XSS-Protection serve ancora?

No. Chrome ha rimosso l’XSS auditor nel 2019, Edge nel 2018; Firefox non l’ha mai avuto. L’header è innocuo come «0» ed era dannoso come «1; mode=block» nei vecchi browser. Rimuovilo e usa la CSP.

Come ottengo gli header di una pagina che fa redirect?

curl -sIL https://example.com/ stampa ogni risposta della catena. Incolla tutto; l’ultima risposta viene valutata e i redirect vengono elencati. Controlla che http:// reindirizzi a https:// in un solo salto.

Il voto corrisponde a securityheaders.com?

Più o meno: entrambi contano gli stessi sei header principali. Questa pagina valuta inoltre il contenuto della CSP e non solo la sua presenza, e toglie punti per fughe di informazioni e header deprecati, quindi un sito con una CSP debole qui ottiene un voto più basso.