Parte 1 della serie "Sicurezza web UE: 10 passi verso un rating migliore"
Il problema in 30 secondi
Il vostro sito ha un certificato TLS. Bene. Ma quando un utente digita http://vostro-dominio.com — cosa succede?
Senza HSTS: il browser si connette in chiaro. Il sito reindirizza a HTTPS. Ma nei millisecondi tra la richiesta HTTP e il reindirizzamento, un attaccante sulla stessa rete (Wi-Fi di un bar, aeroporto, hotel) può dirottare la connessione. Man-in-the-middle, furto di cookie, hijacking di sessione — tutto banale.
Con HSTS: il browser sa già che questo dominio accetta solo HTTPS. Si connette direttamente in modo crittografato. Nessuna richiesta HTTP, nessun reindirizzamento, nessuna finestra di attacco.
Un header. Una riga. E il 72,4% dei siti europei non ce l'ha.
Cosa dicono i dati
Dal SiteGuardian Benchmark su oltre 700.000 siti web europei:
- 27,6% ha HSTS attivo
- 75,7% reindirizza a HTTPS — ma senza HSTS, il reindirizzamento è attaccabile
- 24,3% non reindirizza nemmeno, nonostante un certificato valido
Ciò significa: tre siti su quattro con certificato TLS non lo usano in modo coerente. Il certificato c'è, la protezione no.
Cos'è esattamente HSTS?
HTTP Strict Transport Security (RFC 6797) è un header di risposta HTTP che dice al browser:
"Collegati a questo dominio per i prossimi X secondi esclusivamente tramite HTTPS. Ignora completamente HTTP."
L'header ha questo aspetto:
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— 1 anno (in secondi). Il browser ricorda l'istruzione per questo periodo.includeSubDomains— si applica a tutti i sottodomini (api.vostro-dominio.com, mail.vostro-dominio.com, ecc.)
Dopo la prima visita, il browser si connette direttamente tramite HTTPS per ogni richiesta successiva — senza il passaggio per HTTP.
Come attivare HSTS
Apache (.htaccess o vhost.conf)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Prerequisito: mod_headers deve essere abilitato.
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Il always alla fine garantisce che l'header venga inviato anche sulle pagine di errore (4xx, 5xx).
Caddy
Caddy imposta HSTS automaticamente quando HTTPS è attivo. Non serve fare nulla.
Node.js / Express
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Oppure con il pacchetto helmet:
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
WordPress
Il plugin "Really Simple SSL" o "HTTP Headers" abilita HSTS con un solo clic. In alternativa, aggiungetelo al .htaccess (vedi Apache sopra).
Hosting gestito (Cloudflare, AWS, Platform.sh, ecc.)
La maggior parte dei provider di hosting non imposta HSTS di default. Controllate la dashboard alla voce "Impostazioni SSL/TLS" o "Header HTTP". Se l'opzione non è disponibile, create un file .htaccess nella webroot.
Tre errori da evitare
1. Impostare un max-age troppo breve
max-age=86400 (1 giorno) protegge solo gli utenti che hanno visitato il sito nelle ultime 24 ore. Partite con 30 giorni (2592000), poi passate a 1 anno (31536000) una volta che tutto funziona.
2. Dimenticare includeSubDomains
Senza includeSubDomains, i vostri sottodomini restano raggiungibili via HTTP. Se mail.vostro-dominio.com o intranet.vostro-dominio.com non hanno TLS, aggiungete includeSubDomains solo quando tutti i sottodomini supportano HTTPS — altrimenti smetteranno di funzionare.
3. Attivare HSTS senza un reindirizzamento HTTPS funzionante
HSTS richiede che il vostro sito sia effettivamente raggiungibile tramite HTTPS. Testate prima di attivare: navigate a https://vostro-dominio.com. Se vedete un errore, correggete prima la configurazione del certificato TLS.
HSTS Preload: il passo successivo
Una volta che HSTS funziona e siete sicuri che tutti i sottodomini supportano HTTPS, richiedete l'inclusione nella HSTS preload list:
- Impostate l'header su:
max-age=31536000; includeSubDomains; preload - Inviate il vostro dominio su: hstspreload.org
La preload list è integrata in Chrome, Firefox, Safari ed Edge. I domini nella lista vengono sempre caricati tramite HTTPS — anche alla primissima visita, prima che il browser abbia mai visto l'header HSTS.
Come si collegano NIS2 e GDPR
HSTS non è menzionato per nome in alcuna legge. Ma:
-
NIS2 Art. 21(2)(d) richiede "la sicurezza nell'acquisizione, nello sviluppo e nella manutenzione dei sistemi informativi e di rete, compresa la gestione e la divulgazione delle vulnerabilità". Un header HSTS mancante è una vulnerabilità nota e banalmente sfruttabile.
-
GDPR Art. 32 richiede "misure tecniche adeguate" per proteggere i dati personali. La crittografia del trasporto senza HSTS è come una serratura senza il chiavistello — sembra sicura, ma si apre con un solo gesto.
Controlla il tuo dominio
Attivate HSTS, aspettate 5 minuti e scansionate il vostro dominio:
La scansione vi mostrerà immediatamente se HSTS è correttamente impostato, se includeSubDomains è attivo e se il vostro dominio è idoneo per la preload list.
La prossima settimana nella Parte 2: DMARC — da none a reject. Perché policy=none non protegge nessuno e come raggiungere una policy DMARC efficace in tre passaggi.
Questo articolo fa parte della serie "Sicurezza web UE: 10 passi verso un rating migliore". Dati dal SiteGuardian EU Web Security Benchmark su oltre 700.000 siti web europei.