Réaliser des pages Web interactives :
CGI
Sommaire
La Common Gateway Interface est une technologie
standard implémentée à tous les serveurs Web. Elle permet
l'échange de données (dans les deux sens) entre un programme de
votre cru et le contenu d'une page Web visualisée par un internaute
distant.
Par extension, on appelle aussi "CGI" les programmes
utilisant cette interface. Un tel programme peut être écrit
à l'aide de n'importe quel langage de programmation : les plus
utilisés sont C, perl ou encore python.
A la différence d'un script Java, le programme CGI
sera exécuté sur la machine hébergeant le serveur Web, et
non sur la machine du client. Pour cette raison, il vous faudra certainement
obtenir l'autorisation du Webmaster qui héberge votre site pour pouvo ir
exécuter un tel programme sur sa machine...
Nous allons détailler les démarches à
effectuer pour faire fonctionner un programme CGI.
Pratiquement, pour exécuter un programme CGI
depuis une page Web, il suffit d'indiquer l'endroit où est stocké
le programme (par exemple "www.ecp.fr/cgi-bin/prg.exe") dans le code HTML de la
page, selon une syntaxe qui sera détaillée dans le point suivant
.
Si le serveur Web a été configuré de
telle sorte qu'il considère /cgi-bin comme un répertoire
d'exécution de programmes CGI, il va automatiquement faire
éxécuter le programme par la machine. Si, en revanche, ce
répertoire est inconnu du serveur, celui-ci va tout simplement
considérer le programme comme un fichier que l'utilisateur essaye de
télécharger. Il proposera sa sauvegarde, sans l'excuter.
Le problème est donc le suivant : soit vous
administrez votre propre serveur Web et il ne vous reste plus qu'à le
configurer en conséquence. Soit votre site Web est hébergé
sur une machine sur laquelle vous n'avez pas le pouvoir de faire cette
modificatio n : il vous faut alors demander au Webmaster la permission
d'exécuter des CGI dans votre répertoire...
Attention ! Les programmes CGI peuvent constituer des trous
de sécurité s'ils ne sont pas programmés correctement. Ils
s'exécutent en effet sur la machine locale et prennent comme argument
des chaînes de caractères entrées par un internaute a
priori incon nu ... Les Webmaster qui n'ont pas le temps de relire les sources
de vos programmes refusent donc le plus souvent d'héberger des scripts
CGI.
Note pour les centraliens : le CTI n'hébergera pas
vos CGI, en revanche le serveur des élèves le permet, à
condition que vous fournissiez vos sources.
Le code HTML possède des fonctions spéciales
qui vous permettent de créer des champs dans lesquels l'utilisateur
pourra entrer les données destinées à être
transmises au programme CGI, ainsi que des boutons permettant de
déclencher l'exécution du programm e (si les conditions
exposées précédemment sont vérifiées).
Les champs d'entrée des données
destinées au programme cgi.exe situé dans le répertoire
/cgi-bin sur la machine www.ecp.fr devront par exemple se trouver dans un bloc
délimité par :
<FORM action="http://www.ecp.fr/cgi-bin/cgi.exe"
method=POST> ....... <INPUT type="submit" value="Lancer le
programme"> </FORM>
Le tag FORM délimite ce bloc.
La propriété action de FORM contient le
chemin permettant d'atteindre le programme CGI qu'on veut exécuter.
La propriété method de FORM indique la
manière dont on transmet les données entrées par
l'utilisateur au programme. Il existe deux méthodes de transmission des
données différentes : method=POST et method=GET.
Suivant la méthode choisie, il faudra écrire le programme CGI
d'une manière adaptée.
La méthode GET transmet les données de
manière visible en les ajoutant a la suite de l'URL conduisant au
programme cgi, sous la forme suivante :
"www.ecp.fr/cgi-bin/cgi.exe?name1=value1&name2=value2&name3=value3...."
. Cette méthode est peu pratique et également peu
sécurisante dans la mesure ou toutes les données que vous entrez
(même votre mot de passe par exemple) sont rendues visibles à tous
dans l'URL. Il est donc déconseillé de l'utiliser.
La méthode POST est plus satisfaisante dans la
mesure où elle transmet les données de manière invisible
au programme. C'est celle qu'il est recommandé d'utiliser.
Le tag INPUT caractérisé par la
propriété type="submit" affiche un bouton
(présentant le texte défini dans "value") qui lance
l'exécution du programme cgi.exe. Le code ci-dessus provoque donc
l'affichage suivant (le programme cgi invoqué n'e xiste pas) :
Il est à noter qu'une page HTML
peut contenir autant de blocs de ce type qu'on le souhaite. Seules les
données situées à l'intérieur du bloc auquel
appartient le bouton "submit" validé par l'utilisateur seront transmises
au programme CGI correspondant.
Les champs de données sont le plus souvent obtenus
par la syntaxe :
<INPUT type="TYPE" name="NAME">
La propriété name contient le nom que
vous choisissez de donner à la variable entrée dans le champ
INPUT. Le programme recevra la valeur entrée sous la forme NAME=xxxxx.
Par exemple, si on écrit <INPUT type="text"
name="nom">, l a page Web contiendra un champ où
l'utilisateur peut entrer un texte. S'il tape "Laurent" dans cet espace, le
programme recevra la chaîne de caractères : nom=Laurent.
La propriété type peut prendre
différentes valeurs , selon le type de champ d'entrée qu'on
souhaite afficher :
Type |
Effet obtenu |
"text" |
Affiche un rectangle dans lequel on peut entrer du
texte. |
"password" |
Affiche un rectangle dans lequel on peut entrer du
texte masqué par ***. Utile pour entrer des mots de passe. |
"checkbox" |
Affiche des cases carrées parmi lesquelles
on peut cocher autant de valeurs différentes qu'on le souhaite. Les
valeurs cochées seront toutes affectées à la variable
associée. |
"radio" |
Affiche des cases rondes parmi lesquelles on ne
peut cocher qu'une valeur à l'exception des autres. |
"hidden" |
Ne provoque aucun affichage par le browser. Mais
l'appui sur le bouton de validation provoquera la transmission de la variable
appelée "NAME" de valeur value="xxxxx" comme si l'utilisateur l'avait
entrée. Cette commande est utile lorsqu'on utilise plusieurs programmes
CGI à la suite. Les programmes peuvent ainsi se transmettre des
paramètres automatiquement, sans obliger l'utilisateur à
réentrer à chaque fois les informations données aux
programmes précéde nts. |
"reset" |
Affiche un bouton dont la validation provoque la
réinitialisation de tous les champs à leur valeur par
défaut. |
La syntaxe de base présentée
ci-dessus peut s'enrichir de différents paramètres qui permettent
de contrôler exactement l'apparence et le fonctionnement des champs de
données présentés.
La propriété value indique le contenu
par défaut d'un champ de texte ou de password, la valeur prise par une
case checkbox ou radio lorsqu'elle est cochée par l'utilisateur, la
valeur d'une variable transmise de manière cachée par hidden, ou
encore le texte affiché sur un bouton reset.
La propriété checked, valable seulement
pour les cases radio et checkbox, indique quelles sont les cases cochées
par défaut. Il n'est pas nécessaire de lui affecter une valeur
particulière.
La propriété size, valable seulement
pour les champs texte et password, indique la longueur du rectangle où
l'on entre du texte. La longueur par défaut est 20.
La propriété maxlength, valable
seulement pour les champs texte et password, indique la longueur maximale de la
chaine de caractère que l'utilisateur peut entrer dans ce champ. Par
défaut, cette longueur est illimitée.
Voici un exemple de code ...
<FORM action="http://www.ecp.fr/cgi.exe"
method=GET> <INPUT type="reset" value="Réinitialiser ce
formulaire"> Entrez votre nom : <INPUT type="text" name="nom"
value="Laurent" size=12 maxlength=10> et votre mot de passe : <INPUT
type="password" name="passe" value="secret" size=8 maxlength=6> . Quels
sont vos hobbies : lecture <INPUT type="checkbox" name="hobby"
value="lecture" > , sport <INPUT type="checkbox" name="hobby"
value="sport" checked> , cinéma <INPUT type="checkbox"
name="hobby" value="cinema"> , voyage <INPUT type="checkbox" name="hobby"
value="voyage" checked> . Quel âge avez-vous ? < 15 ans
<INPUT type="radio" name="age" value="15"> , 15-25 ans <INPUT
type="radio" name="age" value="25" checked> , 25-40 ans <INPUT
type="radio" name="age" value="40"> , > 40 ans <INPUT type="radio"
name="age" value="50"> . <INPUT type="hidden" name="cache"
value="99"> <INPUT type="submit" value="Lancer le programme">
</FORM>
... et le résultat qu'il produit (le programme CGI
invoqué n'existe pas, mais les paramètres transmis peuvent
être observés dans la barre indiquant l'URL en haut de votre
browser) :
Il existe deux autres tags HTML qui permettent
d'afficher des champs un peu différents.
Le tag SELECT permet d'afficher des listes. La
syntaxe est la suivante :
<SELECT name="NAME" [multiple]
[size=2]> <OPTION [selected]> Choix 1 <OPTION [selected]>
Choix 2 <OPTION [selected]> Choix 3 </SELECT>
Les crochets [] indiquent des paramètres optionnels
: - size détermine le nombre d'éléments de la
liste affichés - multiple permet la validation de plusieurs
valeurs de la liste à la fois - selected indique quels
éléments de la liste sont validés par défaut
Le tag TEXTAREA permet à
l'utilisateur d'entrer une grande zone de texte. La syntaxe est la suivante :
<TEXTAREA name="NAME" rows=6 cols=40> Ici le
texte par défaut </TEXTAREA>
Evidemment, cols indique le nombre de colonnes et
rows le nombre de lignes. Les retours à la ligne sont
respectés.
Ayant entré toutes les données
nécessaires dans un formulaire, voyons comment récupérer
les données et renvoyer des pages HTML dans un programme en C.
Le cas détaillé ici concerne plus
spécifiquement le langage C, mais il faut insister sur le fait que
n'importe quel langage de programmation peut être utilisé. Il
suffira de transposer la démarche présentée ci-dessous.
Il faut dans un premier temps récupérer
toutes les données transmises au programme CGI par l'utilisateur
distant.
Celles-ci sont toutes assemblées dans même une
chaîne de caractères sous la forme suivante : supposons que
l'utilisateur ait donné la valeur Laurent à la variable "nom", la
valeur 25 à la variable "age", et la valeur cinéma à la
variable "hobby". La chaîne transmise sera :
nom=Laurent&age=25&hobby=cinema, les variables apparaissant dans
le même ordre que dans le formulaire HTM L. Dans la chaîne
reçue, les noms de variable sont donc séparés de leur
valeur par un signe =, et les différents couples variable=valeur sont
séparés par le symbole &.
Pour obtenir cette chaîne, on procède de
manière différente suivant que l'on a soumis le formulaire avec
la méthode POST ou la méthode GET (voir
chapitre
précédent).
Si l'on a utilisé la méthode GET, on
peut récupérer la chaîne de caractères transmise par
le serveur Web dans la variable d'environnement QUERY_STRING. Cela se fait
simplement en utilisant la fonction standard "getenv" du C. On écrira
par exemple, pour obtenir dans temp un pointeur sur la chaîne de
caractères CGI :
char *temp; temp=getenv("QUERY_STRING");
Si l'on a utilisé la méthode POST, on
peut récupérer la chaîne de caractères transmise par
le serveur Web en lisant ces caractères un à un sur
l'entrée standard (stdin en C). On peut donc obtenir dans temp un
pointeur sur la chaîne de caractères CGI en écrivant par
exemple :
char temp[1000],
*t; t=temp; while(!feof(stdin)) { *t=fgetc(stdin); t++; } *t=0;
En plus des données entrées par l'utilisateur,
le programme peut récupérer un certain nombre d'informations sur
le contexte de travail. On peut en effet obtenir par la fonction "getenv" (de
la même manière que précédemment) les valeurs des
variables d'environnement suivantes :
Variable d'environnement |
Information fournie |
SERVER_SOFTWARE |
Nom du logiciel serveur Web |
SERVER_NAME |
Nom DNS de la machine hébergeant le serveur
Web |
GATEWAY_INTERFACE |
Version du protocole CGI utilisée par le
serveur |
SERVER_PROTOCOL |
Version du protocole HTTP utilisée par le
serveur |
SERVER_PORT |
Port utilisé par le serveur Web |
REQUEST_METHOD |
Méthode (GET ou POST) selon laquelle le
formulaire a été soumis |
PATH_TRANSLATED |
Chemin complet menant au programme CGI
lancé |
SCRIPT_NAME |
Nom du programme CGI lancé |
QUERY_STRING |
Si method=GET, contient la chaîne CGI, sinon
vide |
CONTENT_LENGTH |
Si method=POST, contient la longeur de la
chaîne CGI, sinon 0 |
REMOTE_HOST |
Nom DNS de la machine distante qui a soumis le
formulaire |
REMOTE_ADDR |
Adresse IP de cette machine distante |
Le programmeur peut ensuite traiter la
chaîne de caractères à sa guise pour séparer les
différentes variables et les convertir sous une forme exploitable pour
lui. Une fonction d'exemple réalisant ce travail est proposée par
la suite.
Ayant effectué le traitement souhaité en
prenant comme argument les données récupérées par
CGI, le programme doit finalement renvoyer le résultat de son
travail à l'utilisateur sous forme d'une page HTML. C'est très
simple à faire en C, puisqu'il suffit d'envoyer directement le code HTML
sur la sortie standard à l'aide de "printf" par exemple. Ainsi, ayant
récupéré l'âge de l'utilisateur dans la variable int
age, on l'affiche en titre d'une page HTML de la manière suivante :
printf("Content-type:
text/html\n\n"); printf("<HTML>\n"); printf("<h1> %d
</h1>\n",age); printf("</HTML>\n");
Prochainement à cet endroit, une fonction en C qui
renvoie automatiquement les variables et leur valeur décodées
dans un tableau, indépendamment de la méthode selon laquelle le
formulaire a été soumis.
- Une introduction à CGI et toutes les
spécifications de la
Common
Gateway Interface
- Un cours complet avec de nombreux exemples sur les
formulaires HTML
- Documentation et téléchargement de
CGIC, une librairie C
pour coder facilement des applications basées sur CGI en C
- Comment créer des
CGI, avec exemples en Delphi
Rédigé par LapS |