Che cos'è HSTS?
HSTS (HTTP Strict Transport Security) è un meccanismo di sicurezza web che indica ai browser di comunicare con un sito solo tramite HTTPS, mai tramite HTTP. Dopo aver ricevuto un'intestazione HSTS, il browser aggiorna automaticamente a HTTPS tutte le richieste future e rifiuta le connessioni HTTP non cifrate, anche quando l'utente digita esplicitamente http://.
Perché HSTS è importante
Anche con un certificato SSL valido possono esistere vulnerabilità:
Attacco SSL stripping
1. L'utente digita "example.com" (senza https://)
2. L'attaccante intercetta la richiesta HTTP iniziale.
3. L'attaccante fa da proxy verso HTTPS, ma presenta HTTP all'utente.
4. L'utente crede di essere al sicuro, mentre l'attaccante vede tutto.
HSTS impedisce questo attacco assicurando che il browser non effettui mai quella prima richiesta HTTP.
Vantaggi di HSTS
- Previene gli attacchi di downgrade: non è possibile ricadere su HTTP.
- Protegge i segnalibri dell'utente: anche i vecchi segnalibri HTTP diventano HTTPS.
- Elimina i contenuti misti: anche le sotto-risorse vengono forzate a HTTPS.
- Migliora le prestazioni: non servono reindirizzamenti da HTTP a HTTPS.
Sintassi dell'intestazione HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Direttive
| Direttiva | Descrizione |
|---|---|
| max-age | Secondi per cui ricordare HSTS (31536000 = 1 anno) |
| includeSubDomains | Applica HSTS a tutti i sottodomini |
| preload | Acconsente all'inclusione nell'elenco di precaricamento del browser |
Implementare HSTS
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Configurazione con Cloudflare
Abilita l'opzione in SSL/TLS → Edge Certificates → HTTP Strict Transport Security.
Express.js
const helmet = require('helmet');
app.use(helmet.hsts({
maxAge: 31536000,
includeSubDomains: true,
preload: true
}));
Elenco di precaricamento HSTS
L'elenco di precaricamento HSTS contiene domini codificati nei browser che devono essere accessibili esclusivamente tramite HTTPS. Elimina anche la vulnerabilità della prima richiesta HTTP.
Requisiti per il precaricamento
1. Certificato SSL valido.
2. Reindirizzamento di tutto il traffico HTTP a HTTPS.
3. Intestazione HSTS con:
- max-age di almeno 31536000 (1 anno).
- direttiva includeSubDomains.
- direttiva preload.
4. Tutti i sottodomini devono supportare HTTPS.
Inviare il dominio all'elenco di precaricamento
1. Verifica i requisiti: usa hstspreload.org per il controllo.
2. Invia il dominio: inserisci il dominio su hstspreload.org.
3. Attendi l'inclusione: gli aggiornamenti dei browser richiedono da settimane a mesi.
Avvertenze sul precaricamento
Il precaricamento è praticamente permanente. La rimozione dall'elenco richiede mesi e aggiornamenti dei browser. Attivalo solo se sei certo che tutti i sottodomini supporteranno HTTPS a tempo indeterminato.Controllare HSTS
Strumenti per sviluppatori del browser:1. Apri gli strumenti per sviluppatori → scheda Network.
2. Carica il sito.
3. Controlla l'intestazione di risposta Strict-Transport-Security.
Con curl:curl -I https://example.com | grep -i strict
Con DomScan:
curl "https://domscan.net/v1/health?domain=example.com"
# Reports hasHSTS in security details
Stato del precaricamento:
controlla hstspreload.org per verificare se un dominio è precaricato.
Strategia di distribuzione di HSTS
Fase 1: max-age breve
Inizia con un max-age breve per eseguire i test:
Strict-Transport-Security: max-age=300
Se qualcosa si rompe, il browser conserverà la direttiva solo per 5 minuti.
Fase 2: aumenta la durata
Dopo aver verificato che HTTPS funzioni ovunque:
Strict-Transport-Security: max-age=86400
Fase 3: aggiungi i sottodomini
Quando tutti i sottodomini supportano HTTPS:
Strict-Transport-Security: max-age=2592000; includeSubDomains
Fase 4: distribuzione completa e precaricamento
Dopo mesi di funzionamento stabile:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Poi invia il dominio all'elenco di precaricamento.
Problemi comuni di HSTS
Sottodominio senza HTTPS: includeSubDomains interrompe l'accesso a quel sottodominio. Ambienti di sviluppo: HSTS memorizzato dalla produzione può interrompere lo sviluppo locale. Intestazioni CDN/proxy: assicurati che gli intermediari non rimuovano l'intestazione HSTS. Contenuti misti: tutte le risorse devono usare HTTPS; HSTS non corregge le risorse HTTP incorporate.HSTS è essenziale per ogni sito che tratta dati sensibili ed è fortemente raccomandato per tutti i siti HTTPS.