cgi by niusheng11

VIEWS: 24 PAGES: 23

									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:
                                      Hello World!
  <HTML><HEAD></HEAD>
  <BODY>                              Hello World!
  <% For i = 3 To 7 %>
                                      Hello World!
  <FONT SIZE <% = i %> >
  Hello World!<BR>                    Hello World!
  <% Next %>
  </BODY></HTML>                      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 %>
                                 The current number is 1
<BR>
                                 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) {              Now a is 2
   return $par + 1;
 }
 $a = incrementa($a);
 echo(“Now a is”);
 echo ($a);
 ?>
                 CGI: architettura
                        Richiesta




 applicazione
 presentazione   http                            CGI
   sessione
                                                        gateway
     TCP                                                program
     IP
 connessione
     fisico



web browser                         web server
                                                 host
          Richiesta di usuali di files

                                GET /index.html HTTP/1.0




       Client                                         Server

                                                     bla bla
                                                     <html>bla
                                                        bla
                                                     <head> bla
                                                        <html>
                                                            bla
                                                        <head> bla
                                                            <html>
                                                                bla
Il server risponde inviando il contenuto                    <head>
                                                                <html>
                                                                <head>

di un file che è presente nel file system.
         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         program
si trova in una directory particolare
(es: http://…./cgi-bin/….)
   Organizzazione interna del server
La configurazione del server web prevede la definizione di
due directory:
• la directory interna corrispondente
  alla radice del sito web (viene     sito web          cgi
  specificato anche come viene
  acceduta dall’esterno,
  generalmente come “/”)

• la directory interna corrispondente
  alla radice dell’albero degli
                                            file system
  eseguibili (viene specificato anche    interno del server
  come viene acceduta dell’esterno,
  tipicamente come “/cgi-bin/”)
     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                            Server2
                      HTTP
                      Server       CGI
                                 program

             1
                                  HTTP
                 2                Server
         3
             4
              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/cgi-
bin/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      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
                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                     Solo in risposta ad una form
  opportuni all’interno di una
        pagina HTML
              es.
<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      non contiene “=“    LINEA DI
  ad URL (può                              COMANDO
contenere o meno
                      GET
     coppie
“nome = valore”)                           VARIABILI
                            contiene “=“   AMBIENTE



    Submit di           POST
    una form                               STANDARD
 (contiene coppie                            INPUT
 “nome=valore”)
     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              HTTP/1.0
             …
             (una linea vuota)
             nome1=val1&nome2=val2

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…

                            Il server manda
  … comincia per “nph”      l’output del
  (non parsed header)       gateway program al
                            client così com’è

                Il server premette l’header del pacchetto http
                Il client aggiunge
… altrimenti    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/

								
To top