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. 20082009 – 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. 20082009 – 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. 20082009 – 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. 20082009 – 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. 20082009 – 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. 20082009 – 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. 20082009 – v. 1.3 7