Come funziona questo controllo
Questo controllo agisce solo se il tuo sito invia già l'header Strict-Transport-Security; se manca del tutto, lo segnala lo scanner degli header. Scanaris legge il valore e verifica due cose: che max-age sia almeno un anno (31536000 secondi) e che includa includeSubDomains. Se manca una delle due, apre un rilievo di gravità bassa con il dettaglio. Bassa, perché un HSTS corto o parziale protegge ancora qualcosa; ma lascia buchi che un attaccante può sfruttare.
Cosa fa HSTS e perché entrambi gli attributi
Quando il browser riceve questo header in HTTPS, annota il tuo dominio in una lista interna e, per il tempo indicato da max-age, trasforma qualsiasi tentativo di andare su http:// in https:// prima di inviare qualsiasi cosa. Questo elimina la prima richiesta non cifrata che un reindirizzamento non può evitare. Un max-age di qualche ora o giorno lascia l'utente senza protezione a ogni scadenza; da qui il minimo di un anno. Senza includeSubDomains, un attaccante può puntare a qualsiasicosa.tuodominio.it in HTTP e, per come funzionano i cookie di dominio, rubare o fissare cookie validi per il sito principale.
Come risolvere
Il valore consigliato:
Strict-Transport-Security: max-age=31536000; includeSubDomains
- Vercel: lo imposta di default sui domini personalizzati; se usi
vercel.jsononext.configper altri header, aggiungilo lì con questo valore. - Netlify: nel file
_headers, sotto/*. - Nuxt: in
routeRulesdinuxt.config, regola'/**'. - nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;nel bloccoserverdella 443. - Express:
helmet.hsts({ maxAge: 31536000, includeSubDomains: true }).
Prima di aggiungere includeSubDomains, conferma che tutti i tuoi sottodomini servano HTTPS: il pannello di amministrazione, l'API, il blog presso un altro fornitore, il sottodominio della posta se ha un sito. Qualsiasi sottodominio che risponde solo in HTTP smetterà di funzionare nei browser che hanno già visto l'header, e non c'è modo di tornare indietro finché max-age non scade. Nel dubbio, inizia con max-age=86400 e senza sottodomini, verifica, e alza il valore quando tutto funziona.
Preload
Con preload e un max-age di almeno un anno, puoi richiedere l'inclusione del tuo dominio nella lista incorporata in Chrome, Firefox e Safari: così nemmeno la prima visita passa per HTTP. È la differenza abituale tra una A e una A+ negli strumenti di analisi. Ma è un impegno quasi irreversibile (uscire dalla lista richiede mesi), quindi fallo solo quando tutto il dominio è in HTTPS da un po' senza incidenti.
Verifica che sia risolto
curl -sI https://tuodominio.it | grep -i strict-transport
Deve mostrare un max-age di 31536000 o più e includeSubDomains. Verifica sull'URL pubblico: se hai una CDN davanti, è lei che deve inviarlo.
Domande frequenti
HSTS sostituisce il reindirizzamento da HTTP a HTTPS?
No. L'header arriva solo in HTTPS, quindi la prima visita ha ancora bisogno del reindirizzamento. Sono complementari: il reindirizzamento per la prima volta, HSTS per tutte le altre.
Ho un sottodominio interno che va solo in HTTP.
Allora non mettere includeSubDomains prima di averlo migrato, e accetta il rilievo di gravità bassa nel frattempo. Un sottodominio non cifrato è un rischio reale per i cookie del dominio, quindi la migrazione vale la pena.
Cosa succede se lo configuro male?
I browser che hanno ricevuto l'header manterranno la politica fino alla sua scadenza. Puoi inviare max-age=0 per chiedere loro di dimenticarla, ma lo vedranno solo quelli che tornano in HTTPS. Per questo è meglio iniziare con valori brevi.