Protocollo HTTP - Politecnico di Milano Sede di Cremona

Transcript

Protocollo HTTP - Politecnico di Milano Sede di Cremona
Protocollo HTTP
Introduzione
Hypertext Transfer Protocol (HTTP) is the method used to transfer or convey information on the
World Wide Web. It is a patented open internet protocol whose original purpose was to provide a
way to publish and receive HTML pages.
Development of HTTP was coordinated by the World Wide Web Consortium and working groups
of the Internet Engineering Task Force, culminating in the publication of a series of RFCs, most
notably RFC 2616, which defines HTTP/1.1, the version of HTTP in common use today.
HTTP is a request/response protocol between clients and servers. The originating client, such as a
web browser, spider, or other end-user tool, is referred to as the user agent. The destination server,
which stores or creates resources such as HTML files and images, is called the origin server. In
between the user agent and origin server may be several intermediaries, such as proxies, gateways,
and tunnels.
An HTTP client initiates a request by establishing a Transmission Control Protocol (TCP)
connection to a particular port on a remote host (port 80 by default). An HTTP server listening on
that port waits for the client to send a Request Message.
Upon receiving the request, the server sends back a status line, such as "HTTP/1.1 200 OK", and a
message of its own, the body of which is perhaps the requested file, an error message, or some other
information.
Resources to be accessed by HTTP are identified using Uniform Resource Identifiers (URIs) (or,
more specifically, URLs) using the http: or https URI schemes.
Fonte: Wikipedia - http://en.wikipedia.org/wiki/Http
Utilizzo
Semplificando il funzionamento di una comunicazione tramite protocollo HTTP si può fare
riferimento a Fig. 1 che descrive il funzionamento di un server web “statico”; con la dicitura statico
si specifica un server in grado di erogare pagine web al client realizzate una tantum da un
programmatore HTML (Hyper Text Markup Language, il linguaggio con cui si realizzano le pagine
web) e memorizzate sul file-system del server stesso.
client-side
server-side
3
web
browser
Rete
web
server
1
2
Fig. 1: schema di funzionamento di un comune server web “statico”
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
1
In dettaglio:
1. il client (un browser web, uno script, un programma apposito, un motore di ricerca etc.)
richiede una determinata “pagina” web tramite la specificazione di un apposito URI (v.
tabella definizione URI in seguito) utilizzando il protocollo HTTP
2. il server identifica sul file-system la pagina richiesta e la carica
3. il server consegna al client la pagina richiesta tramite protocollo HTTP (può segnalare anche
un errore di “Page not found”); il client “renderizza” la pagina interpretando il codice
HTML ricevuto
Internet standard STD 66 (also RFC 3986) defines the generic syntax to be used in all URI
schemes. Every URI is defined as consisting of four parts, as follows:
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
The scheme name consist of a letter followed by any combination of letters, digits, and the plus
("+"), period ("."), or hyphen ("-") characters; and is terminated by a colon (":").
The hierarchical part of the URI is intended to hold identification information hierarchical in nature.
Usually this part begins with a double forward slash ("//"), followed by an authority part and an
optional path. The authority part holds an optional user information part terminated with "@" (e.g.
username:password@), a hostname (i.e. domain name or IP address), and an optional port number
preceded by a colon ":". The path part is a sequence of segments (conceptually similar to
directories, though not necessarily representing them) separated by a forward slash ("/"). Each
segment can contain parameters separated from it using a semicolon (";"), though this is rarely used
in practice.
The query is an optional part separated with a question mark, which contains additional
identification information which is not hierarchical in nature. Its syntax is not generically defined,
but is commonly organized as a sequence of <key>=<value> pairs separated by an ampersand, e. g.
key1=value1&key2=value2&key3=value3.
The fragment is an optional part separated from the front parts by a hash ("#"). It holds additional
identifying information which allows indirect identification of a secondary resource, e.g. a section
heading in an article identified by the remainder of the URI.
Examples:
The following are two example URIs and their component parts (taken from STD 66):
foo://example.com:8042/over/there?name=ferret#nose
\ /
\______________/\_________/ \_________/ \__/
|
|
|
|
|
scheme
authority
path
query
fragment
Some official IANA-registered schemes: dav: dns: file: ftp: h323: http: imap: ldap: mailto: news:
nntp: pop: sip: snmp: xmpp: - Some unofficial URI schemes: about: callto: ed2k: irc: mms:
secondlife: skype: smb:
Fonte: Wikipedia - http://en.wikipedia.org/wiki/URI_scheme
Nella distribuzione Knoppix utilizzata è già installato ed è attivo al boot un server HTTP; si tratta
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
2
del server web più conosciuto e utilizzato al mondo: Apache (si pronuncia “apaci”).
Per testarne lo stato è possibile utilizzare il seguente comando (da utente root):
# netstat -nat
per verificare che in effetti la porta 80 è in ascolto per connessioni con protocollo TCP; è in ascolto anche la porta 443 che consente di utilizzare il protocollo HTTPS. Per interrompere e rilanciare il server web apache è possibile utilizzare i seguenti comandi:
# /etc/init.d/apache2 stop
# /etc/init.d/apache2 start
Il server HTTP memorizza le pagine web all'interno del file system dedicato allo scopo e rimane in
attesa che dalla rete vengano richieste le pagine memorizzate tramite l'opportuno URL. Le pagine
web (codificate tramite il linguaggio HTML) sono memorizzate sul server a partire dalla directory
“/var/www/”.
E' possibile accedere a questo albero di file e directory a partire dall'indirizzo “http://127.0.0.1/”;
inserendo questo URI all'interno di un browser web verrà visualizzata la pagina di default del server
web installato in Knoppix. La pagina visualizzata ha come path assoluto sul server
“/var/www/index.html” (è quindi raggiungibile anche con l'URI “http://127.0.0.1/index.html”).
Esercizio 1
Eseguire una cattura di una connessione al proprio server WEB (o a quello di un collega oppure a
un server web in rete Internet) eseguita tramite browser web, per accertarsi che la comunicazione
TCP utilizzi il protocollo HTTP. Verificare inoltre che la pagina trasferita sia effettivamente
codificata in linguaggio HTML.
Esercizio 2
Eseguire una cattura di una connessione al proprio server WEB “http://127.0.0.1/”: quante “GET”
vengono eseguite? Perchè?
Nota
In questo tipo di esercizi si faccia attenzione se si utilizzano sempre le stesse pagine web per le
prove; queste possono essere infatti memorizzate nella memoria “cache” del browser e quindi si
può verificare la possibilità che richiedendo con successo una certa pagina questa non generi
traffico sulla rete perché già presente nelle memoria del browser. Per forzare il caricamento della
pagina dalla sorgente remote è sufficiente in genere premere il pulsante ricarica del browser
tenendo premuto il tasto SHIFT.
Nota
Si faccia anche attenzione nel caso si eseguano le prove su una rete che utilizza un proxy web;
anche in questo caso possono essere utilizzate delle copie cache. Inoltre il traffico è sempre tra il
browser e il server proxy e non avviene mai tra il browser web e il server HTTP remoto.
E' possibile anche per il protocollo HTTP simulare il comportamento di un browser web tramite una
connessione telnet.
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
3
Ad esempio nel modo che segue è possibile richiede una pagina web:
# telnet <INDIRIZZO_IP_SERVER_HTTP> 80
Trying <INDIRIZZO_IP_SERVER_HTTP>...
Connected to xxx.yyy.zzz (<INDIRIZZO_IP_SERVER_HTTP>).
Escape character is '^]'.
GET /index.html HTTP/1.0
(nota: dare 2 volte invio...)
HTTP/1.1 200 OK
Date: Wed, 21 Jun 2006 21:11:55 GMT
Server: Apache/1.3.36 (Unix) PHP/4.4.2
Content-Location: index.html.en
Vary: negotiate,accept-language,accept-charset
TCN: choice
Last-Modified: Thu, 06 Jan 2005 12:11:39 GMT
ETag: "6520dc-5b0-41dd2afb;4487d931"
Accept-Ranges: bytes
Content-Length: 1456
Connection: close
Content-Type: text/html
Content-Language: en
Expires: Wed, 21 Jun 2006 21:11:55 GMT
<!DOCTYPE html ... RESTO DELLA PAGINA ...
Il server invia l'intera pagina e termina la connessione
E' possibile utilizzare vari metodi per richiedere una data URI. In sintesi:
Metodo
Descrizione
GET
Richiede un file al server. La risposta è composta da vari header separati con due CR
(invio) dalla risorsa effettivamente richiesta (il file HTML che contiene la pagina
richiesta). Tra i primi dati specificati all'inizio della risposta si trova il protocollo usato
(HTTP/1.1) e lo Status Code che indica l'esito della richiesta (v. prossimi esercizi).
E' possibile specificare dei valori da passare come parametri alla pagina invocata; questi
sono presenti in coppie attributo=valore&attributo=valore
Es: GET / HTTP/1.0
HEAD
Richiede solo l'header, senza la risorsa (il file HTML, l'immagine, ecc.). Di fatto viene
usato soprattutto per diagnostica.
Es: HEAD / HTTP/1.0
POST
Invia informazioni all'URL specificato. Le informazioni sono presenti in coppie
attributo=valore&attributo=valore e vengono processate dal server sulla base di come è
configurato e di come è fatto il file a cui vengono postate.
OPTIONS
Richiede l'elenco dei metodi permessi dal server
Es: OPTIONS * HTTP/1.0
TRACE
Traccia una richiesta, visualizzando come viene trattata dal server.
Es: TRACE * HTTP/1.0
DELETE
Cancella una risorsa (file) sul server. L'utente con cui è in esecuzione il web server deve
poter avere permessi in scrittura sul file indicato e il server deve essere configurato per
poterlo fare.
PUT
Esegue l'upload di un file sul server, creandolo o riscrivendolo, con il nome indicato e i
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
4
contenuti specificati nella parte che segue gli header.
Esercizio 3
Eseguire una richiesta di una delle pagine web identificata negli esercizi precedenti utilizzando il
metodo appena descritto; si tratta “quasi” della stessa connessione eseguita con il browser web.
Che cosa manca?
Esercizio 4
Testare i vari metodi del protocollo HTTP elencati precedentemente tramite connessioni telnet.
Il protocollo HTTP ha vari codici di stato con cui indica eventuali errori nelle risposte. In breve:
Codice errore
Descrizione
1**
Questa classe di status consiste solo nello status line e in headers opzionali.
INFORMATIONAL HTTP/1.0 non definisce nessuno status code 1XX.
2**
SUCCESSFUL
CLIENT
REQUEST
Questi codici di stato indicano che la richiesta da parte del client è stata
ricevuta, capita e accettata. Ad esempio “200 OK “ significa che la richiesta
è stata accolta, il server risponde con i dati richiesti. E' la risposta normale
per un file correttamente trasferito.
3**
CLIENT
REQUEST
REDIRECTED
Questa classe di status indica che si necessita di un'ulteriore azione per far si
che la richiesta sia correttamente effettuata.
4**
CLIENT
REQUEST
ERRORS
La classe di status 4XX è riservata ai casi in cui il client commette degli
errori. Ad esempio “404” (Page not found)
5**
Questa classe di status è riservata ai casi in cui il server commette un errore o
SERVER ERRORS non è in grado di esaudire la richiesta. In genere richiede un intervento
sistemistico sul server.
Esercizio 5
Simulare una connessione e provocare un errore di tipo “404”; catturare e analizzare il traffico.
Oltre a pagine HTML, il server Apache installato su Knoppix è in grado di interpretare pagine
scritte in linguaggio PHP (è possibile con molti altri linguaggi) nel momento in cui queste vengono
richieste al server. In pratica non viene semplicemente prelevata la pagina dal file system e
consegnata al richiedente, ma viene interpretata dal server prima di consegnare il risultato della
computazione al richiedente. E' ovvio che il risultato della computazione dovrà essere codificato in
linguaggio HTML per essere correttamente visualizzato dal browser; tale procedura è nota anche
come “server side scripting” (v. definizione in seguito) identificato anche con la dicitura “server
web dinamico”.
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
5
Server-side scripting is a web server technology in which a user's request is fulfilled by running a
script directly on the web server to generate dynamic HTML pages. It is usually used to provide
interactive web sites that interface to databases or other data stores. This is different from client-side
scripting where scripts are run by the viewing web browser, usually in JavaScript. The primary
advantage to server-side scripting is the ability to highly customize the response based on the user's
requirements, access rights, or queries into data stores.
Fonte: Wikipedia
client-side
server-side
4
5
web
browser
Rete
1
web
server
application
backend
2
3
Altre
fonti
Database
Fig. 2: schema di funzionamento di un comune server web “dinamico”
In dettaglio:
1. il client (un browser web, uno script, un programma apposito, un motore di ricerca etc.)
richiede una determinata “pagina” web tramite la specificazione di un apposito URI
utilizzando il protocollo HTTP (un esempio classico è quello di un utente che riempie i
campi di una form per inviare o ricevere dati da un sito web)
2. il server identifica la tipologia di richiesta dinamica (ad esempio la richiesta non è per una
pagina web terminante con il suffisso “.html” ma di una pagina PHP terminante con il
suffisso “.php”)
3. il server interpreta lo script richiesto, eventualmente interpreta dei parametri di ingresso
passati dal client tramite metodo GET/POST, eventualmente interroga altri sistemi per
ottenere/memorizzare informazioni (es. tipico: database SQL)
4. il server elabora una risposta e la codifica in linguaggio HTML
5. il server consegna al client la pagina richiesta tramite protocollo HTTP (può segnalare anche
un errore di “Page not found”); il client “renderizza” la pagina interpretando il codice
HTML ricevuto
Esercizio 6
Catturare una sessione HTTP in cui si esegue una ricerca tramite il motore di ricerca Google. Quali
sono le variabili passate in GET?
A titolo di esempio si costruisce ora uno script in linguaggio PHP (abbastanza simile al C come
sintassi) in grado di calcolare la somma di due numeri passati “in GET”.
Spostandosi nella directory appropriata con il comando
# cd /var/www/
creare un nuovo file denominato “somma.php”. All'interno di tale file inserire:
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
6
<?php
echo "Primo addendo: " . $HTTP_GET_VARS["a"];
echo "<br>";
echo "Secondo addendo: " . $HTTP_GET_VARS["b"];
echo "<br>";
echo "Somma: <b>" . ($HTTP_GET_VARS["a"] + $HTTP_GET_VARS["b"]) ."</b>";
?>
Questo script ha lo scopo di:
➢ recuperare il valore delle due variabili (“a” e “b”) passate in GET (contenuto nell'array
associativo HTTP_GET_VARS)
➢ visualizzarle tramite il comando “echo” (equivalente a un'istruzione C “printf”; il simbolo
“.” esegue la concatenazione di stringhe)
➢ visualizzare infine il risultato, in neretto, della loro somma matematica.
Lo script viene invocato con il seguente URL:
http://127.0.0.1/somma.php?a=4&b=6
Esercizio 7
Catturare il traffico generato dalla connessione e individuare il valore delle variabili “a” e “b”.
Esercizio 8
Un webmail è un esempio classico di applicazione web dinamica:
➢ riceve i parametri di login di un dato utente
➢ elabora la richiesta e verifica che le credenziali siano corrette
➢ interroga un server POP3/IMAP per:
•
ricevere la lista delle e-mail in arrivo
•
cancellare e-mail
•
inviare e-mail
•
etc.
Catturare il traffico generato da una connessione al proprio webmail e verificare il livello di
sicurezza: si è in grado di catturare la password di login? Si è in grado di catturare il contenuto
delle e-mail? Quale possibile miglioramento è possibile a questo tipo di servizio?
Approfondimenti
➢
➢
➢
➢
Protocollo HTTP: RFC 1945, 2616
http://www.w3.org/Protocols/
Apache Web Server:
http://www.apache.org
Linguaggio HTML:
http://www.w3.org/MarkUp/
Linguaggio PHP:
http://www.php.net
Carlo Todeschini – [email protected]
Reti di Comunicazione e Internet – Politecnico di Milano sede di Cremona – A.A. 2008­2009 – v. 1.3
7