Professional Documents
Culture Documents
Magali Contensin
Table des matires
1
Introdu tion
2.1
2.2
2
2
3
4
Requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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
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
2.1 Requte
La requte envoye par le
lient est
ompose des
hamps :
mthode
en-tte
des riptif
orps
User-Agent:
A
ept:
Content-En
oding:
Content-Length:
Content-Type:
2.2 Rponse
La rponse envoye par le serveur est
ompose des
hamps :
statut
en-tte
des
riptif
do ument
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
"<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";
http://pytheas.univ-mrs.fr/~votrenom/essai.pl
4
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.
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 à
<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>
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>";
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>";
}
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 :
#!/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
Vous obtiendrez le rsultat
i-dessous (notez que tous les lments asso
is la
l nourriture ont t
a
hs) :
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.
<HTML>
<HEAD>
</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
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
10
<HTML>
<HEAD>
<TITLE>essai d'isindex</TITLE>
<ISINDEX PROMPT="vous
her
hez ">
</HEAD>
<BODY BGCOLOR="#FFFFCC">
</BODY>
</HTML>
6
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
Client
HTTP_ACCEPT
HTTP_COOKIE
HTTP_USER_AGENT
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_USER
11
Requte
REQUEST_METHOD
AUTH_TYPE
CONTENT_LENGTH
CONTENT_TYPE
PATH_INFO
QUERY_STRING
8
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) :
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 :
12
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)