Tutoriels,  Cours, Forums, Download, Exemples de code, Scripts, Gratuit et Freeware, Tests, Comparatifs, etc.


VB
Web
PHP
ASP
XML
UML
Asm
W E B  -  I N T E R N E T  -  R E S E A U X

Réaliser des pages Web interactives : CGI


Sommaire

1. Qu'est-ce que la Common Gateway Interface ?

2. Comment faire fonctionner CGI sur ma page Web ?

3. Comment réaliser un formulaire HTML ?

4. Comment écrire un proramme CGI en C ?

5. Liens utiles à ce sujet.


 

1. Qu'est-ce que la Common Gateway Interface ?

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.

2. Comment faire fonctionner CGI sur ma page Web ?

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.

3. Comment réaliser un formulaire HTML ?

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) :

Entrez votre nom : et votre mot de passe : .

Quels sont vos hobbies : lecture , sport , cinéma , voyage .

Quel âge avez-vous ? < 15 ans , 15-25 ans , 25-40 ans , > 40 ans .

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

Exemple -> Choisissez un fruit

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.

Exemple -> Ecrivez un roman ci-contre :

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.

4. Comment écrire un programme CGI 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.
 

5. Liens utiles à ce sujet.

- 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


VB
Web
PHP
ASP
XML
UML
Asm
Vos questions techniques : Forum d'entraide Internet - Publiez vos avis, liens, cours & articles : Publication
et rejoignez-nous dans l'équipe de rédaction de l'Association d'entraide des développeurs Francophones
Copyright 2000, 2001 www.developpez.com
Hit-Parade