Pillole di Internet: come viaggiano in rete i file binari trasmessi con HTTP?

Spread the love

Ho scritto una semplice pagina web che invia un file (ho scelto una immagine PNG piccolina) al mio localhost. L’HTML di questa pagina è il seguente

 <form action="upload.php" 
      enctype="multipart/form-data" 
       method="post">
      <input type="file" name="file">
      <input type="submit">
 </form>

Catturando con Wireshark il traffico HTTP rilevo:

Questo è quello che si osserva una volta che si preme il pulsante Invia del modulino, dopo aver selezionato l’immagine. In particolare, di tutto il messaggio HTTP che viene compilato dal browser ho qui riportato l’inizio della parte contenente l’immagine, che è l’informazione binaria che vogliamo capire come viaggia in rete.

In particolare possiamo notare, leggendo la colonna centrale del dump riportato da Wireshark, che in HTTP non passa solo testo ma anche informazioni puramente binarie. I singoli bytes sono a volte superiori a 7F (=011111112) – e i caratteri codificati in ASCII standard sono a 7 bit – per cui si tratta di bytes a 8 bit (con il bit più significativo a 1) e non 7 (cioè con il bit più significativo a 0). Non c’è inoltre alcuna applicazione di una codifica base64 ai bytes che compongono il messaggio.

Da Internet la RFC-2388 recita:

 4.3 Encoding

  While the HTTP protocol can transport arbitrary binary data, the
  default for mail transport is the 7BIT encoding.  The value supplied
  for a part may need to be encoded and the "content-transfer-encoding"
  header supplied if the value does not conform to the default
  encoding.      

Quindi, a imitazione del protocollo SMTP, si potrebbe codificare il file (che nella mail è l’allegato) utilizzando la codifica base64, ma in questo caso la codifica adottata è 8 bit. La scelta della codifica è ampia, come si desume dalla grammatica di encoding riportata nella rfc-1521:

        encoding := "Content-Transfer-Encoding" ":" mechanism

           mechanism :=     "7bit"  ;  case-insensitive
                          / "quoted-printable"
                          / "base64"
                          / "8bit"
                          / "binary"
                          / x-token 

In sintesi: il browser costruisce un file che contiene tutte le parti (multipart) contenute nei campi della form (multipart/form-data in questo caso solo due, l’immagine ed il pulsante di invio); in questo file tutto ciò che è testo rimane testo e ciò che è binario rimane binario; ogni elemento del form è separato dagli altri da un delimitatore (lo potete notare all’inizio della colonna di destra nell’immagine della cattura Wireshark):

——WebKitFormBoundaryXxWGBqDWd6OsDPE2

(per questo il tipo di encoding, o enctype, utilizzato dal browser è il multipart/form-data)

Le informazioni di intestazione che precedono il messaggio HTTP sono

POST /test/upload.php HTTP/1.1
 Host: js
 Connection: keep-alive
 Content-Length: 3840
 Cache-Control: max-age=0
 Origin: http://js
 Upgrade-Insecure-Requests: 1
 DNT: 1
 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXxWGBqDWd6OsDPE2
 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.28 Safari/537.36
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
 Referer: http://js/test/post.php
 Accept-Encoding: gzip, deflate
 Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,fr;q=0.6,la;q=0.5

Sul significato di tutti questi parametri a breve faccio un altro post.

Nota bene: per poter fare un’analisi simile dobbiamo mantenere in chiaro la trasmissione (non usare HTTPS)

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.