ioProgrammo N°6, Luglio/Agosto 1997 ©Copyright DIEMME Editori
PROGRAMMAZIONE CGI
Inizia con questo numero una breve serie di articoli dedicati alla programmazione per Internet
Il tutto nasce all'inizio degli anni '90 grazie ad un gruppo di ingegneri e fisici del CERN di Ginevra, che anziché progettare bombe atomiche o all'antimateria (e meno male!), crearono le fondamenta per il primo sistema informativo planetario (...universale per chi non crede ai marziani).
Alla sua base stanno un protocollo di comunicazione come l'HTTP, un linguaggio semplice ed efficace come l'HTML, di cui ioProgrammo sta proponendo un corso dettagliato, e la CGI.
COS'E' LA CGI
La CGI (Common Gateway Interface) è un'interfaccia che definisce il modo in cui un server di informazioni (server web) e alcuni programmi (programmi gateway) comunicano. Lo scambio di informazioni avviene mediante variabili d'ambiente speciali, argomenti della riga di comando o, nel caso più frequente, mediante i parametri di un modulo da compilare (i form html, per intenderci).
I METODI CGI
Lo scambio di informazioni tra client, programma cgi e server, avviene secondo la seguente sequenza fondamentale:
- il server web invia al client (browser dell'utente) il documento html richiesto, per esempio un modulo da compilare.
- quando si clicca sul pulsante di submit del modulo, il browser (netscape o internet explorer) invia i dati del modulo al server usando il metodo GET o POST definito nel tag FORM mediante il parametro METHOD, così: <FORM METHOD="POST" ACTION="http://etc.">
- il server web verifica che si sta puntando ad un programma cgi (il parametro ACTION del tag FORM serve proprio a questo) ed invia a quest'ultimo i dati del modulo.
- il programma gateway elabora i dati del modulo e restituisce un nuovo documento html al server che lo invia al client dell'utente.
Per quanto riguarda invece il programma cgi, questo può ricevere i dati da elaborare in uno dei tre modi seguenti:
- come argomenti sulla riga di comando, con le richieste ISINDEX o ISMAP
- nella variabile d'ambiente QUERY_STRING, per tutte le richieste che usano il metodo GET ed anche ISINDEX e ISMAP
- sullo standard input, solo con il metodo POST. La lunghezza dei dati passati è definita nella variabile d'ambiente CONTENT_LENGTH. In questo caso il programma gateway dovrà avere una funzione di parsing per decodificare i dati che arrivano formattati in base alle regole del protocollo HTTP.
IL SERVER
Come fa il server a sapere che i dati inviati dal browser dovranno essere processati da un programma cgi? Bisogna agire nei file di configurazione del server.
Se usiamo il server Apache nel file access.conf ci sarà una direttiva simile a questa
<Directory /usr/local/etc/httpd/cgi-bin>
mentre nel file srm.conf ci sarà qualcosa come:
ScriptAlias /cgi-bin /usr/local/etc/httpd/cgi-bin
Tali direttive definiscono le directory in cui sono contenuti i programmi gateway.
Per cui, supponendo di lavorare a livello locale (client e server sullo stesso pc), il modulo che inizia con <FORM METHOD="POST" ACTION="http://localhost/cgi-bin/prova.cgi"> invierà i dati al programma prova.cgi nella directory /cgi-bin del server.
I PROGRAMMI GATEWAY
Per scrivere programmi compatibili con le specifiche cgi si può usare qualsiasi linguaggio di programmazione, dal C al Visual Basic. Noi useremo il Perl, sia per mantenere una promessa fatta e sia perchè questo linguaggio sembra nato proprio per scrivere script di gateway.
Teoricamente non vi sono limiti all'uso di questi programmi. In generale vengono usati per consentire:
- la ricerca di informazioni nei database
- la generazione dinamica di statistiche e grafici
- la gestione di input tramite moduli da compilare.
SICUREZZA
Finché si lavora a livello locale la sicurezza del nostro server è in effetti un problema relativo. Nel momento in cui però si inizia a programmare in un ambiente multiutente, lo sviluppo di programmi cgi e la configurazione del server web debbono rispettare alcune norme di sicurezza per la salvaguardia dell'integrità del sistema e dei dati in esso contenuti.
Scrivere un programma di gateway e renderlo eseguibile in una macchina collegata ad Internet equivale a permettere l'esecuzione di quel programma al mondo intero. Esiste quindi la
possibilità, nemmeno tanto remota, che un client attacchi il server proprio attraverso il cgi.
Ci sono alcune semplici regole da seguire per programmare in modo sicuro.
Innanzi tutto il server httpd non deve mai essere eseguito con i diritti del SuperUser (root). Inoltre sarebbe molto utile che tutti i dati e i programmi cgi degli utenti fossero gestiti in una partizione diversa dalla principale in modo da "montare" un nuovo file system dedicato proprio a tale scopo. Poi bisogna fare attenzione all'uso di chiamate di sistema nei programmi cgi, magari quando si costruiscono comandi con le funzioni system(), exec() e popen() usando i dati provenienti dal client. Infine è necessaria un'attenta configurazione del server prestando particolare attenzione alle direttive di Server-Side-Includes.
PER INIZIARE
Non esiste niente di meglio e più economico che una macchina Linux per programmare Internet a livello nativo.
Nel CD di ioProgrammo di Maggio c'è tutto il necessario. Una fantastica distribuzione di Linux, come la RedHat 4.1, e tutto il software per installare un server web completo.
Nei nostri esempi si lavorerà sempre in locale, per cui tutte le chiamate al server avranno questa forma generale:
http://localhost/cgi-bin/scriptcgi
TESTIAMO L'AMBIENTE CGI
Questo semplice script Perl lista sulla pagina del browser tutte le variabili d'ambiente supportate dallo standard CGI.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><HEAD>\n";
print "<TITLE>Ambiente CGI</TITLE>\n";
print "</HEAD>\n";
print "<BODY bgcolor=#ffffff>\n";
print "<H1>Ambiente CGI</H1>\n";
foreach $env_var (keys %ENV) {
print "<B>$env_var</B> = $ENV{$env_var}<BR>\n";
}
print "</BODY></HTML>\n";
Salviamo questo cgi nella directory /cgi-bin del server con il nome test.cgi e lo richiamiamo da netscape con http://localhost/cgi-bin/test.cgi. Il risultato in figura 1.
SU INTERNET
Per sapere tutto su HTTP e CGI
http://www.w3.org
http://hoohoo.ncsa.uiuc.edu/cgi/
Per scaricare e configurare l'ultima versione del server web Apache
http://www.apache.org
Data creazione HTML: Febbraio 1998
Autore: Francesco Munaretto
E-mail: NoSpam@thank.you