La sicurezza dei sistemi e dei dati delle persone passa anche dalla comunicazione tra il client ed il server, ed HSTS, HTTP Strict Transport Security, serve per aumentare, appunto, la sicurezza nei siti web. Ormai tutti gli ecommerce e siti internet, che per fornire il servizio hanno bisogno dei dati della persona, utilizzano https come protocollo almeno dal momento in cui iniziano a trattare questi dati, nella sua versione TLS.
Ma qua sorge il problema: siamo sicuri che tutte le chiamate siano effettuate in modo criptato con https?
Nella maggioranza dei casi la prima chiamata è sempre HTTP ed il sistema farà un redirect alla pagina HTTPS. Poco male si dirà, ci sarà due chiamate e il cliente aspetterà. Il problema è però che la prima richiesta è stata effettuata in chiaro e dei dati sensibili potrebbero esser stati inviati in maniera non criptata.
Per evitare tutto questo possiamo fare in modo che il sito sia sempre in HTTPS istruendo il browser che quel dominio lavora solo in HTTPS per un certo periodo di tempo.
HSTS ed i browser
Il funzionamento è semplice: tra gli header della risposta HTTPS da parte di un sito “HSTS enabled”, si deve inserire, tramite ad esempio una riga in virtualhost, un nuovo header Strict-Transport-Security. Il valore di questo campo è un max-age che specifica in secondi per quanto tempo tale dominio dovrà essere richiesto solo tramite HTTPS, qualsiasi cosa l’utente scriva sulla barra degli indirizzi.
I moderni browser, che ormai supportano tutti HSTS, si tengono una lista dei domini SOLO HTTPS per il periodo specificato, quindi mettendo un numero di secondi molto alto il sito diventa più sicuro oltre a diminuire chiamate di redirect.
Come si implementa HSTS?
Semplice
Se si usa Apache si può inserire nel vhost o semplicemente in .htaccess
Header always set Strict-Transport-Security "max-age=300; includeSubDomains; preload"
Se si usa lighthttp aggiungere in /etc/lighttpd/lighttpd.conf
server.modules += ( "mod_setenv" ) $HTTP["scheme"] == "https" { setenv.add-response-header = ("Strict-Transport-Security" => "max-age=300; includeSubDomains; preload") }
Se si usa nginx nel vostro file di conf
add_header Strict-Transport-Security 'max-age=300; includeSubDomains; preload; always;'
Ed infine se si utilizza Microsoft IIS aggiungere
protected void Application_BeginRequest(Object sender, EventArgs e) { switch (Request.Url.Scheme) { case "https": Response.AddHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload"); break; case "http": var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; Response.Status = "301 Moved Permanently"; Response.AddHeader("Location", path); break; } }