HTTP è un protocollo a livello di applicazione utilizzato per accedere alle risorse sul World Wide Web. Il termine hypertext sta per testo contenente collegamenti ad altre risorse e testo che può essere facilmente interpretato dai lettori. La comunicazione HTTP è costituita da un client e un server, in cui il client richiede una risorsa al server.

Il server elabora le richieste e restituisce la risorsa richiesta. La porta predefinita per la comunicazione HTTP è la TCP 80; tuttavia, questo comportamento può essere tranquillamente modificato.  Nel momento in cui digitiamo un nome di dominio completo (FQDN) come Uniform Resource Locator (URL) per raggiungere il sito Web desiderato, come www.nexsys.it, ci verrà risolto l’URL in indirizzo IP (tramite risoluzione DNS) e andremo a connetterci alla home del webserver indicato.

Struttura Url

Struttura URL

L’URL ci offre molte più possibilità rispetto alla semplice specifica del sito web che vogliamo visitare. La struttura di un URL è composta di diversi componenti che messi assieme rappresentano il percorso completo per accedere ad una specifica risorsa. Tra i diversi componenti troviamo:

Schema

Viene utilizzato per identificare il protocollo a cui il client accede. Di solito è http o https.

User Info

Si tratta di un componente opzionale che contiene le credenziali nel formato nome utente: password, utilizzato per l’autenticazione sull’host.

Host

L’host indica la posizione della risorsa. Può essere un nome host o un indirizzo IP. I due punti separano un host e una porta.

Porta

Gli URL senza una porta specificata puntano alla porta predefinita 80. Se la porta del server HTTP non è in esecuzione sulla porta 80, può essere specificata nell’URL.

Path

Puntamento alla risorsa a cui si accede, che potrebbe essere un file o una cartella. Se non è specificato alcun percorso, il server restituisce il documento di indice predefinito ospitato da esso (ad esempio, index.html).

Query String

La stringa della query è preceduta da un punto interrogativo (?). Questo è un altro componente opzionale utilizzato per passare le informazioni alla risorsa. Una stringa di query è costituita da un parametro e un valore. Nell’esempio sopra, il parametro è login e il suo valore è true. Possono esserci più parametri separati da una e commerciale (&).

Fragments

Questo viene elaborato dai browser lato client per individuare le sezioni all’interno della risorsa primaria.

Non tutti i componenti sono sempre necessari per accedere a una risorsa. Tuttavia, un URL dovrebbe contenere almeno uno schema e un host al fine di effettuare una richiesta appropriata.

Protocollo http

Flusso richieste HTTP

La prima volta che un utente immette un URL (nexsys.it) nel browser, richiede a un server DNS (Domain Name Resolution) di risolvere il dominio. Il server DNS cerca l’indirizzo IP di nexsys.it e lo restituisce. Tutti i nomi di dominio devono essere risolti in questo modo, poiché un server non può comunicare senza un indirizzo IP.

Successivamente, il browser invia una richiesta GET alla porta HTTP predefinita, ovvero 80, chiedendo la cartella principale /. Qui il GET rappresenta il metodo di richiesta. Il tipo di richiesta può variare, come vedremo in seguito. Il server web riceve la richiesta e la elabora. Per impostazione predefinita, i server sono configurati per restituire un file di indice quando viene ricevuta una richiesta per /.

In questo caso, il contenuto di index.html viene letto e restituito dal server web come risposta HTTP. La risposta contiene anche informazioni come il codice di stato 200 OK, che significa che la richiesta è stata elaborata correttamente. I contenuti index.html vengono quindi visualizzati dal browser web e presentati all’utente. HTML (HyperText Markup Language) è un linguaggio lato client che viene compreso ed elaborato dai browser.

È il linguaggio di markup standard per visualizzare i documenti tramite un browser web. Le pagine HTML sono assistite da Cascading Style Sheets (CSS), che consentono flessibilità per l’applicazione di elementi di presentazione come layout, colori e caratteri a una o più pagine Web, nonché linguaggi di scripting come JavaScript che permettono di ottenere pagine Web interattive.

protocollo https

Hypertext Transfer Protocol Secure (HTTPS)

Uno dei principali svantaggi del protocollo HTTP è che tutti i dati viaggiano in chiaro, tramite testo non crittografato, il che significa che chiunque tra l’origine e la destinazione può eseguire un attacco Man-in-the-middle (MiTM) per visualizzare i dati trasferiti. Questo è un grosso problema con i siti Web bancari e governativi, che contengono dati sensibili degli utenti.

Nel momento in cui proviamo ad accedere ad un sito http e sniffare il traffico di rete utilizzando un analizzatore grafico di protocollo di rete a pacchetti come Wireshark, possiamo notare come le credenziali di accesso possano essere intercettate in chiaro. Ciò renderebbe facile per qualcuno sulla stessa rete (come ad esempio una rete wireless pubblica) catturarli e utilizzarli per scopi dannosi.

Wireshark sniff http

Queste problematiche hanno dato origine al protocollo HTTPS (HTTP Secure). Quando questo protocollo è abilitato, tutte le comunicazioni tra il client (utente che accede a un’applicazione Web tramite il browser Web) e il server Web che ospita l’applicazione Web vengono crittografate. Quando HTTPS viene implementato su un’applicazione web, diventa impossibile per chiunque intercettare e analizzare il traffico e acquisire informazioni come credenziali e altri dati sensibili. I siti Web che applicano HTTPS possono essere identificati tramite https: // nell’URL (ad esempio, https://www.nexsys.it) e tramite l’icona del lucchetto nella barra degli indirizzi del browser Web, a sinistra dell’URL.

L’esecuzione di Wireshark durante la navigazione su https://www.nexsys.it mostra il traffico che passa sulla rete crittografato.

Wireshark Sniff Https

Una volta risolto il nome in indirizzo IP, il client (browser web) invia un pacchetto “client hello”, fornendo informazioni su se stesso. Dopo questo, il server risponde con “server hello”, seguito da uno scambio di chiavi. Il client verifica questa chiave e ne invia una propria. Successivamente, viene avviato un handshake crittografato per verificare se la crittografia e il trasferimento funzionano correttamente. Una volta completato correttamente l’handshake, viene continuata la normale comunicazione HTTP, che viene successivamente crittografata. Questa è una panoramica di alto livello dello scambio di chiavi, che va oltre lo scopo di questo modulo.

A seconda delle circostanze, un utente malintenzionato potrebbe essere in grado di eseguire un attacco di downgrade HTTP, che esegue il downgrade della comunicazione HTTPS a HTTP. Questo viene fatto impostando un attacco man-in-the-middle (MITM) e inviando tramite proxy (passando) tutto il traffico attraverso l’host dell’attaccante all’insaputa dell’utente. Un attacco di downgrade riuscito comporterebbe il trasferimento in chiaro di dati HTTP, che l’attaccante potrà quindi registrare e successivamente esaminare o modificare per scopi dannosi.