LA PROGRAMMATION CGI
  Sommaire
  Introduction au CGI
Notion de variable d'environnement
|
Les variables d'environnement sont, comme leur nom l'indique, des données stockées
dans des variables permettant au programme d'avoir des informations sur son environnement. L'environnement,
dans le cas du programme CGI est:
Ces variables sont créées par le serveur à chaque fois que le programme CGI est
appelé, le serveur les lui fournit en paramètres cachés lors de l'exécution
de l'interpréteur.
Elles permettent notamment d'avoir des informations sur le type de serveur, son administrateur, la date à laquelle
le CGI a été appelé, l'adresse IP et le type de navigateur du client,...
Les variables d'environnement
|
On peut donc classer les variables d'environnement en deux catégories:
- Les variables d'environnement dépendant du client
- Les variables d'environnement dépendant du serveur
Les variables d'environnement dépendant du client
|
| Variable d'environnement |
Description |
| AUTH_TYPE |
Il s'agit de la méthode d'authentification qui a été utilisée
par le client pour accéder au programme CGI |
| CONTENT_LENGTH |
Longueur du corps de la requête. Il s'agit de la taille des données envoyées au CGI par l'intermédiaire
de la méthode POST d'un formulaire |
| CONTENT_TYPE |
Type de données contenu présent dans le corps de la requête. Il s'agit du
type MIME des données |
| HTTP_COOKIE |
Cookie du client si jamais un cookie est effectivement présent sur le disque du client |
| HTTP_REFERER |
URL de la page qui a appelé le script CGI |
| HTTP_REQUEST_METHOD |
Cette variable indique le type de méthode utilisée
pour envoyer les données au programme CGI. Il s'agit de GET,HEAD,POST,PUT ou DELETE. Dans le cas de la méthode
GET, les données sont encodées avec l'URL de requête, dans le cas de la méthode POST, par contre,
les données présentes dans le corps de la requête sont accessibles via le fichier de flux d'entrée standard
nommé STDIN |
| HTTP_USER_AGENT |
Cette variable permet d'avoir des informations sur le type de navigateur utilisé par le client,
ainsi que son système d'exploitation |
| PATH |
Il s'agit du chemin d'accès au script CGI |
| PATH_INFO |
Il s'agit de la partie de l'URL (ayant servie à accéder au script CGI)
située avant le point d'interrogation. Il s'agit donc du chamin d'accès au script
CGI sans prendre en compte les données supplémentaires |
| PATH_TRANSLATED |
Il s'agit du chemin d'accès absolu au script CGI, c'est-à-dire
l'emplacement absolu du script sur le serveur |
| QUERY_STRING |
Il s'agit de la partie de l'URL (ayant servie à accéder au script CGI)
située après le point d'interrogation. C'est de cette manière que sont transmises
les données d'un formulaire dans le cas de la méthode GET |
| REMOTE_ADDR |
Cette variable contient l'adresse IP du client
appelant le script CGI |
| REMOTE_USER |
Cette variable n'existe que si le client a été soumis à une authentification,
et contient alors le couple nom_d_utilisateur/mot_de_passe |
| SCRIPT_FILENAME |
Chemin d'accès complet au script CGI |
| SCRIPT_NAME |
Chemin d'accès relatif (par rapport au chemin d'accès à la racine web) au script CGI |
| SERVER_PORT |
port TCP auxquel les données ont été envoyées
(généralement le port 80) |
| SERVER_PROTOCOL |
Nom et version du protocole utilisé pour envoyer la requête au script CGI |
Les variables d'environnement dépendant du serveur
|
| Variable d'environnement |
Description |
| DATE_GMT |
Date actuelle au format GMT |
| DATE_LOCAL |
Date actuelle au format local |
| DOCUMENT_ROOT |
Racine des documents Web sur le serveur |
| GATEWAY_INTERFACE |
Version des spécifications CGI utilisées par le serveur |
| HTTP_HOST |
Nom de domaine du serveur |
| SERVER_ADMIN |
Adresse de l'administrateur du serveur |
| SERVER_SOFTWARE |
Type (logiciel) du serveur web |
Affichage des variables d'environnement
|
Il est possible de créer un script permettant de visualiser l'ensemble des variables
d'environnement. En voici un écrit en Perl:
#!/usr/local/bin/perl
print "content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>Variables d'environnement</TITLE></HEAD>\n";
print "<BODY>\n";
foreach $key (sort(keys %ENV)) {
print "$key = $ENV($key)<BR>\n";
}
print "</BODY>";
  Communication entre serveur et navigateur
Notion d'URL et d'en-tête HTTP
|
Un URL (Uniform Resource Locator) est une adresse permettant
de localiser un fichier sur Internet de manière unique. C'est grâce à cette adresse
(du genre http://www.commentcamarche.net) qu'il est possible d'effectuer des requêtes
de pages web. Lorsqu'une telle requête est effectuée sur Internet, celle-ci circule
grâce à la suite de protocole TCP/IP et en particulier
le protocole HTTP (HyperText Transfer Protocol), permettant
d'envoyer des données encapsulées dans un datagramme contenant un grand nombre
d'en-tête permettant d'identifier par exemple:
- le fichier demandé
- l'adresse IP du demandeur
- Le navigateur effectuant la requête
- ...
Schéma de requête d'un navigateur à un serveur Web
|
Pour apprendre à utiliser les CGI, il est essentiel de comprendre comment se
déroule la communication entre le navigateur et le serveur lors de la demande
d'une page web. Pour cela, il est préférable d'avoir des notions sur
le protocole HTTP...
Lorsqu'un navigateur effectue une requête (typiquement par saisie ou clic d'un URL,
ou bien par envoi d'un formulaire), les étapes suivantes se déroulent:
- les données de requête sont envoyées
au serveur sous forme d'en-têtes de requête HTTP
- Lorsque le serveur reçoit la requête, il analyse les en-têtes HTTP,
notamment celui permettant de localiser le fichier demandé.
- Si le serveur trouve le fichier HTML demandé,
il va envoyer au client
(le navigateur) un en-tête de réponse valide (Généralement Success)
et les données créées par l'application
- A la réception
du document, le navigateur affiche le résultat à l'écran.
Dans le cas d'un CGI, le schéma est un petit peu plus compliqué:
- les données de requête sont envoyées
au serveur sous forme d'en-têtes de requête HTTP
- Lorsque le serveur reçoit
la requête, il analyse les en-têtes HTTP, notamment celui permettant de localiser le
fichier demandé.
- Le serveur va ensuite analyser l'extension du fichier, puis exécuter
l'application associée à ce type de fichier (l'interpréteur Perl dans le cas d'une
extension .pl par exemple), en fournissant à cette application les en-têtes de
requête HTTP sous forme de variable d'environnement.
- L'application va donc s'exécuter
puis fournir des données de sortie (commençant par une formulation d'en-tête
de la forme content-type : text/html) au serveur.
- Le serveur va envoyer au client
(le navigateur) un en-tête de réponse valide (Généralement Success)
ainsi que les données créées par l'application
- A la réception du document, le navigateur affiche le résultat à l'écran.
  Envoi des données
But d'un script CGI
|
Les script CGI ont pour but d'afficher des pages Web ayant été générées
par un programme informatique, d'où la dénomination de pages web dynamiques pourles
pages créées par ce moyen. Toutefois, étant donné que le serveur revoie
telles quelles au navigateur les informations que lui fournissent le script CGI, il est nécessaire
d'ajouter aux données à afficher les en-têtes HTTP
permettant au navigateur de comprendre qu'il s'agit d'une page web...
|
Le programme CGI doit créer lui-même les en-têtes HTTP
|
Envoi des en-têtes HTTP
|
Puisque le serveur ne crée pas d'en-têtes pour les CGi, la première
chose qu'un CGI doit faire consiste à envoyer un en-tête HTTP correspondant
au type de fichier qu'il renvoie. Compte-tenu du fait que le rôle principal des CGI
est de créer des pages dynamiques, l'en-tête HTTP correspondra au type text/html.
La première chaîne envoyée au navigateur est donc:
content-type : text/html\n\n
|
Les deux retours chariot sont indispensables!
- le premier sert simplement à retourner à la ligne
- le second sert à créer la ligne vide séparant les en-têtes
HTTP du corps du message, comme le veut la spécification du protocole HTTP
|
Vous vous demandez sûrement pourquoi le serveur ne pourrait pas ajouter tout seul
les en-têtes HTTP, comme il le fait dans le cas des pages web statiques (fichiers
.htm et .html). En fait, un programme CGI peut renvoyer n'importe quel type
de contenu, c'est-à-dire qu'il est capable de renvoyer une image octet par octet,
qui sera intégrée dans un document HTML par exemple, pourvu que le CGI renvoie
un en-tête correspondant au type de l'image. Une fois de plus, le serveur pourrait éventuellement
être capable de reconnaître le type de données que le CGI renvoie et adapter
les en-têtes HTTP en fonction. En réalité les en-têtes HTTP peuvent
faire beaucoup plus que préciser le type de document envoyé il est par exemple possible d'effectuer une redirection
en renvoyant un en-tête de redirection. Une des applications peut par exemple consister à
pointer vers un CGI, qui va enregistrer des informations sur le visiteur (une sorte de compteur de visites
amélioré), puis le diriger vers un document...
Exemple de script CGI en Perl
|
Voici un exemple de script tout simple permettant d'afficher une page web sur laquelle
est écrit "Hello World" (cette phrase est sans aucun doute la phrase
la plus vue sur le Web, car c'est la première chaîne que les programmeurs en herbe
affichent par coutume).
#! /usr/local/bin/perl
print "content-type : text/html\n\n";
print "<HTML>";
print "<HEAD>";
print "<TITLE>Hello world</TITLE>";
print "</HEAD>";
print "<BODY>";
print "<Hello world!>";
print "</BODY>";
print "</HTML>";
Voyons maintenant un autre exemple, dans lequel le programme CGI effectue uniquement une
redirection vers l'URL http://www.commentcamarche.net:
#! /usr/local/bin/perl
print "location : http://ww%77.commen%74camarche.net";
  Reception des données
Envoyer des données à un script CGI
|
L'envoi de données à un script CGi se fait par l'intermédiaire
d'un formulaire HTML.
Les formulaires HTML se créent à l'aide de la balise <FORM>
contenant des boutons, des champs, des listes et/ou des cases à cocher repérés
par des noms auxquels seront associés des valeurs, fonction de la saisie des utilisateurs,
puis d'un bouton de soumission du formulaire qui enverra l'ensemble des informations au script
indiqué en tant qu'attribut Action de la balise FORM selon la méthode
GET ou POST. Chaque élément du formulaire doit possèder un nom unique, de
telle façon que la valeur associé à l'élément forme avec le nom
de celui-ci une paire nom/valeur du type:
Nom_de_l_element=valeur
L'ensemble des paires nom/valeur sont séparées par des esperluettes (le caractère
"&". Ainsi, l'envoi d'un formulaire crée une chaîne de la forme:
champ1=valeur1&champ2=valeur2&champ3=valeur3
L'envoi de cette chaîne se fera différamment selon que la méthode utilisée
pour l'envoi du formulaire est GET ou POST.
Méthodes GET et POST
|
La méthode GET permet d'envoyer les éléments du formulaire
au travers de l'URL du script, en ajoutant l'ensemble des paires nom/valeur à l'URL
du script, séparé de celui-ci par un point d'interrogation, ce qui donne
un URL du type:
http://nom_du_serveur/cgi-bin/script.cgi?champ1=valeur1&champ2=valeur2...
Toutefois, la longueur de la chaîne URL étant limitée à 255 caractères,
les informations situées au-delà de cette limite seront irrémédiablement perdues.
De plus, cela crée une URL surchargée dans la barre d'adresse d'un navigateur et peut dévoiler
des informations sensibles comme un mot de passe...
Ainsi, la méthode POST est une bonne alternative à la méthode GET. Cette méthode
code les informations de la même façon que la méthode GET (encodage URL
et paires nom/valeur) mais elle envoie les données à la suite des en-têtes HTTP, dans un champ
appelé corps de la requête. De cette façon la quantité de données envoyées
n'est pus limitée, et est connue du serveur grâce à l'en-tête permettant de connaître
la taille du corps de la requête.
  variables d'environnement
Notion de variable d'environnement
|
Les variables d'environnement sont, comme leur nom l'indique, des données stockées
dans des variables permettant au programme d'avoir des informations sur son environnement. L'environnement,
dans le cas du programme CGI est:
Ces variables sont créées par le serveur à chaque fois que le programme CGI est
appelé, le serveur les lui fournit en paramètres cachés lors de l'exécution
de l'interpréteur.
Elles permettent notamment d'avoir des informations sur le type de serveur, son administrateur, la date à laquelle
le CGI a été appelé, l'adresse IP et le type de navigateur du client,...
Les variables d'environnement
|
On peut donc classer les variables d'environnement en deux catégories:
- Les variables d'environnement dépendant du client
- Les variables d'environnement dépendant du serveur
Les variables d'environnement dépendant du client
|
| Variable d'environnement |
Description |
| AUTH_TYPE |
Il s'agit de la méthode d'authentification qui a été utilisée
par le client pour accéder au programme CGI |
| CONTENT_LENGTH |
Longueur du corps de la requête. Il s'agit de la taille des données envoyées au CGI par l'intermédiaire
de la méthode POST d'un formulaire |
| CONTENT_TYPE |
Type de données contenu présent dans le corps de la requête. Il s'agit du
type MIME des données |
| HTTP_COOKIE |
Cookie du client si jamais un cookie est effectivement présent sur le disque du client |
| HTTP_REFERER |
URL de la page qui a appelé le script CGI |
| HTTP_REQUEST_METHOD |
Cette variable indique le type de méthode utilisée
pour envoyer les données au programme CGI. Il s'agit de GET,HEAD,POST,PUT ou DELETE. Dans le cas de la méthode
GET, les données sont encodées avec l'URL de requête, dans le cas de la méthode POST, par contre,
les données présentes dans le corps de la requête sont accessibles via le fichier de flux d'entrée standard
nommé STDIN |
| HTTP_USER_AGENT |
Cette variable permet d'avoir des informations sur le type de navigateur utilisé par le client,
ainsi que son système d'exploitation |
| PATH |
Il s'agit du chemin d'accès au script CGI |
| PATH_INFO |
Il s'agit de la partie de l'URL (ayant servie à accéder au script CGI)
située avant le point d'interrogation. Il s'agit donc du chamin d'accès au script
CGI sans prendre en compte les données supplémentaires |
| PATH_TRANSLATED |
Il s'agit du chemin d'accès absolu au script CGI, c'est-à-dire
l'emplacement absolu du script sur le serveur |
| QUERY_STRING |
Il s'agit de la partie de l'URL (ayant servie à accéder au script CGI)
située après le point d'interrogation. C'est de cette manière que sont transmises
les données d'un formulaire dans le cas de la méthode GET |
| REMOTE_ADDR |
Cette variable contient l'adresse IP du client
appelant le script CGI |
| REMOTE_USER |
Cette variable n'existe que si le client a été soumis à une authentification,
et contient alors le couple nom_d_utilisateur/mot_de_passe |
| SCRIPT_FILENAME |
Chemin d'accès complet au script CGI |
| SCRIPT_NAME |
Chemin d'accès relatif (par rapport au chemin d'accès à la racine web) au script CGI |
| SERVER_PORT |
port TCP auxquel les données ont été envoyées
(généralement le port 80) |
| SERVER_PROTOCOL |
Nom et version du protocole utilisé pour envoyer la requête au script CGI |
Les variables d'environnement dépendant du serveur
|
| Variable d'environnement |
Description |
| DATE_GMT |
Date actuelle au format GMT |
| DATE_LOCAL |
Date actuelle au format local |
| DOCUMENT_ROOT |
Racine des documents Web sur le serveur |
| GATEWAY_INTERFACE |
Version des spécifications CGI utilisées par le serveur |
| HTTP_HOST |
Nom de domaine du serveur |
| SERVER_ADMIN |
Adresse de l'administrateur du serveur |
| SERVER_SOFTWARE |
Type (logiciel) du serveur web |
Affichage des variables d'environnement
|
Il est possible de créer un script permettant de visualiser l'ensemble des variables
d'environnement. En voici un écrit en Perl:
#!/usr/local/bin/perl
print "content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>Variables d'environnement</TITLE></HEAD>\n";
print "<BODY>\n";
foreach $key (sort(keys %ENV)) {
print "$key = $ENV($key)<BR>\n";
}
print "</BODY>";
|