Common Gateway Interface

Download Report

Transcript Common Gateway Interface

Common Gateway Interface
Dynamic HTML
Tecnologie che consentono di mostrare su Web l’output di programmi
• le risposte inviate al client sono (parzialmente o totalmente)
create on-the-fly (al volo) dopo aver ricevuto il pacchetto di
richiesta
• il contenuto delle pagine può variare di volta in volta in base a
parametri diversi (ora del giorno, stato del sistema, dati
trasmessi dal client). I motori di ricerca, per esempio,
rispondono alle interrogazioni con delle pagine html
contenenti link
• necessitano di supporto da parte del web server
– CGI, Servlet: chiamata di programmi esterni
– ASP, JSP, PHP: codice direttamente dentro le pagine html
ed interpretato dal server (il client non lo può vedere)
ASP (Active Server Pages)
• E’ uno standard Microsoft
• Sono le pagine che hanno l’estensione .ASP
• Utilizzano ActiveX scripting (generalmente codice VBscript
o JavaScript)
Esempio:
<HTML><HEAD></HEAD>
<BODY>
<% For i = 3 To 7 %>
<FONT SIZE <% = i %> >
Hello World!<BR>
<% Next %>
</BODY></HTML>
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
JSP (Java Server Pages)
Risposta della Sun all’ASP di Microsoft
Utilizzano codice Java embeddato nel file HTTP
<% for(int i=1; i<6; i++) { %>
The current number is
<%= i %>
<BR>
<% } %>
The current number is 1
The current number is 2
The current number is 3
The current number is 4
The current number is 5
PHP (PHP Hypertext Preprocessor)
Creato da un privato (Rasmus Lerdorf) nel 1994
Distribuito con diversi Web servers (per es. Apache)
Utilizza una sintassi simile al Perl or C
<?php
$a = 1;
Function incrementa ($par) {
return $par + 1;
}
$a = incrementa($a);
echo(“Now a is”);
echo ($a);
?>
Now a is 2
CGI: architettura
Richiesta
applicazione
presentazione
CGI
http
sessione
TCP
IP
connessione
fisico
web browser
web server
host
gateway
program
Richiesta di usuali di files
GET /index.html HTTP/1.0
Client
Il server risponde inviando il contenuto
di un file che è presente nel file system.
Server
bla bla
<html>
bla bla
<head>
<html>
bla bla
<head>
<html>
bla bla
<head>
<html>
<head>
Esecuzione di un CGI
GET /cgi-bin/program?par1+par2 HTTP/1.0
Server
Client
il server riconosce una chiamata ad un
CGI dal fatto che la “risorsa” richiesta
si trova in una directory particolare
(es: http://…./cgi-bin/….)
program
Organizzazione interna del server
La configurazione del server web prevede la definizione di
due directory:
• la directory interna corrispondente
sito web
alla radice del sito web (viene
specificato anche come viene
acceduta dall’esterno,
generalmente come “/”)
• la directory interna corrispondente
alla radice dell’albero degli
eseguibili (viene specificato anche
come viene acceduta dell’esterno,
tipicamente come “/cgi-bin/”)
cgi
file system
interno del server
Input e output del CGI program
L’input di un CGI è una sequenza di valori o di coppie
nome=valore
I dati vengono mandati al server tramite pacchetti GET o POST
del protocollo http.
• un pacchetto GET viene inviato quando:
– L’utente specifica l’URL di un CGI
– Si clicca un link all’URL di un CGI
– Invio dati da una FORM con METHOD=GET
• un pacchetto POST viene inviato quando:
– Invio dati da una FORM con METHOD=POST
La form HTML
Server1
form.html
Client
HTTP
Server
1
2
3
4
Server2
CGI
program
HTTP
Server
Un esempio di FORM
un esempio di form
In quale città vivi?
Che browser stai usando?
1) Netscape
2) Explorer
Submit
Reset
<FORM METHOD=POST ACTION= “http://www.dia.uniroma3.it/cgibin/miofile”>
<P>In quale città vivi?
<INPUT NAME=“city” TYPE=text SIZE=“20”>
<P>Che browser stai usando?
<P> Netscape <INPUT NAME=“brow” TYPE=radio VALUE=“netscape”>
<P> Explorer <INPUT NAME=“brow” TYPE=radio VALUE=“explorer”>
<P><INPUT TYPE=submit> <INPUT TYPE=reset>
</FORM>
Marcatori HTML per le FORM
<FORM></FORM> possibili attributi:
METHOD=GET
METHOD=POST
ACTION=“http://host.com/cgi-bin/miofile”
<INPUT>
possibili attributi:
TYPE=TEXT
(input testuale)
TYPE=CHECKBOX
(selezione)
TYPE=RADIO
(selezione esclusiva)
TYPE=SUBMIT
(tasto per inviare i dati)
TYPE=RESET
(per cancellare i dati)
NAME=“mia_etichetta”
VALUE=“valore_associato” (se selezionato)
CHECKED
(selezionato per default)
<SELECT> <OPTION>...</SELECT> (menù a tendina)
possibili attributi:
NAME=“mia_etichetta”
Pacchetto GET
GET
/cgi-bin/miofile?city=roma&brow=netscape
Referer: http://www.spc.com/form.html
User-Agent: Mozilla/4.05 [en] (Win95; I)
Host: www.spc.com
Accept: image/gif, image/x-xbitmap, image/jpeg, */*
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
HTTP/1.0
Pacchetto POST
POST
/cgi-bin/miofile
HTTP/1.0
Referer: http://www.spc.com/form.html
User-Agent: Mozilla/4.05 [en] (Win95; I)
Host: www.spc.com
Accept: image/gif, image/x-xbitmap, image/jpeg, */*
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Content-type: application/x-www-form-urlencoded
Content-length: 23
city=roma&brow=netscape
GET
Vs
POST
Indicato per pochi parametri
Indicato per grandi quantità
di dati
Solo parametri testuali
Dati in qualsiasi formato
(testi, immagini, video)
Possibilità di inserire un
URL con parametri
opportuni all’interno di una
pagina HTML
es.
Solo in risposta ad una form
<A HREF=“http://www.altavista.com/cgi-bin/search?query=complexity> Ricerca
Altavista sulla complessità</A>...
Interazione webserver-CGI
Esistono tre modi per passare i parametri dal
server al CGI:
• come argomenti della linea di comando
• come variabili di ambiente
• come standard input
Il CGI invia la risposta al server sempre su
standard output
Passaggio dei parametri
chiamata diretta
ad URL (può
contenere o meno
coppie
“nome = valore”)
non contiene “=“
GET
contiene “=“
Submit di
una form
(contiene coppie
“nome=valore”)
LINEA DI
COMANDO
POST
VARIABILI
AMBIENTE
STANDARD
INPUT
Passaggio sulla linea di comando
il client invia una richiesta http:
GET /cgi-bin/mioprog?val1+val2 HTTP/1.0
il server esegue: mioprog val1 val2
nel codice del programma mioprog.c
i parametri potranno essere recuperati in questo modo:
main(int argc, char** argv)
{
…
argv[1];
/* contiene val1 */
argv[2];
/* contiene val2 */
…
}
Passaggio per standard input
il client invia una richiesta http:
POST /cgi-bin/mioprog
…
(una linea vuota)
nome1=val1&nome2=val2
HTTP/1.0
il server passa i parametri a mioprog dallo standard input
nel codice del programma mioprog.c ci saranno istruzioni come:
scanf(“%s”,stringa);
oppure
char c = getchar();
al programmatore è lasciato il compito di fare il parsing della stringa
Passaggio con variabile di ambiente
il client invia una richiesta http:
GET /cgi-bin/mioprog?nome1=val1&nome2=val2 HTTP/1.0
il server esegue mioprog ma prima mette la stringa
“nome1=val1&nome2=val2”
nella variabile di ambiente QUERY_STRING
nel codice del programma mioprog.c ci saranno istruzioni come:
char * str = getenv("QUERY_STRING");
al programmatore è lasciato il compito di fare il parsing della stringa
Dal gateway al server
(solo tramite standard output)
Se il nome del gateway program…
… comincia per “nph”
(non parsed header)
… altrimenti
Il server manda
l’output del
gateway program al
client così com’è
Il server premette l’header del pacchetto http
Il client aggiunge
Content-type: type/subtype
(una riga vuota)
…il resto del pacchetto http
Considerazioni sui CGI
• è possibile scrivere un CGI in un qualsiasi linguaggio (es.
C, PERL, JAVA, VisualBasic)
• ogni consultazione di un CGI prevede il lancio di un nuovo
processo sul server (questo può essere troppo oneroso)
• c’è un potenziale pericolo per la sicurezza dovuto al fatto
che l’applicazione CGI viene lanciata dal processo server
(con i privilegi di quest’ultimo)
• è uno standard de facto. Un tentativo di standardizzazione
(Common Gateway Interface RFC Project) può essere
reperito qui: http://web.golux.com/coar/cgi/