SELFHTML

Module CGI: Fonctions pour la programmation CGI

Page d'information: vue d'ensemble

vers le bas Généralités sur le module CGI
vers le bas Incorporer le module CGI dans des scripts
vers le bas Sorties HTML avec le module CGI
vers le bas Mentions avancées pour l'entête HTTP et pour l'entête de fichier HTML
vers le bas Traitement de formulaires avec le module CGI
vers le bas Rechercher les données d'environnement avec le module CGI
vers le bas Gérer les témoins de connexion (Cookies) avec le module CGI
vers le bas Ré-acheminements automatiques avec le module CGI
vers le bas Réglages de sécurité avec le module CGI

 vers le bas 

Généralités sur le module CGI

Le module CGI fait partie des Autre page d'information modules standard depuis la version Perl 5.004. Il dispose d'une quantité de fonctions qui prennent en charge les tâches routinières typiques des scripts CGI. Les fonctions qu'il contient ont fait leurs preuves par leur utilisation répétée dans la pratique. C'est pourquoi il est judicieux de faire appel aux ressources proposées dans ce module pour les scripts CGI. Un inconvénient du module CGI est, il est vrai, qu'il est volumineux. Pour les scripts CGI qui sont appelés très souvent (par exemple les scripts de compteur d'accès aux pages fréquemment visitées), cela peut se faire sentir à la mobilisation des ressources de l'ordinateur serveur. Dans ces cas là une décision en connaissance de cause de ne pas employer le module CGI est tout à fait concevable. Pour la plupart des scripts CGI cependant, l'utilisation du module CGI est recommandée. Car le module prend aussi en charge entre autres toute une série d'adaptations automatiques à l'environnement d'exécution du script, par lesquelles des erreurs possibles sont évitées.

Le module CGI et constitué d'un module principal et de différents sous modules. Les sous modules exécutent des tâches spéciales comme par exemple le soutien du nouveau standard Fast-CGI ou le soutien de ce qu'on appelle les poussées du serveur (Server-Pushs).

Il y a deux façons d'utiliser le module CGI: la première orientées sur l'objet et la deuxième orientée sur la fonction. L'utilisation orientée sur l'objet passe pour plus élégante et offre davantage de possibilités comme par exemple la définition de plusieurs objets CGI indépendants dans le même script. C'est la raison pour laquelle les descriptions de cette section se limitent à l'utilisation orientée sur l'objet.

 vers le hautvers le bas 

Incorporer le module CGI dans des scripts

L'exemple qui suit montre comment incorporer le module CGI dans son propre script et l'utiliser dans un style orienté sur l'objet.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use CGI;
use CGI::Carp qw(fatalsToBrowser);
$cgi = new CGI;

print $cgi->header('text/plain'), "Hello monde";

Explication:

Avec use CGI vous incorporez le module CGI dans votre script. Dans l'exemple est néanmoins encore incorporé un sous module nommé CGI::Carp, plus exactement une certaine fonction de ce sous-module, à savoir la fonction fatalsToBrowser. Il est toujours judicieux de l'incorporer lors du développement de scripts CGI. La fonction fait en sorte que tous les messages d'erreurs créés par l'interpréteur Perl soient sortis directement dans le navigateur.

Après avoir incorporé le module CGI, une nouvelle instance de l'objet CGI est créée avec $cgi = new CGI. Avec cette instruction, vous posez l'embranchement pour utiliser le module CGI de la façon orientée sur l'objet. L'instance objet de la classe CGI peut être maintenant adressée par la scalaire $cgi. Par la scalaire vous avez accès lors du reste de l'exécution du script aux fonctions proposées par le module CGI. Dans le contexte orienté sur l'objet on ne parle cependant plus de fonctions mais de méthodes.

Le nom de la scalaire, qui, dans l'exemple, s'appelle $cgi, peut être choisi librement. Étant donné cependant que vous aurez besoin très souvent la plupart du temps de la scalaire dans le reste du script, le choix d'un nom court est recommandé. Beaucoup de programmeurs travaillent avec des noms d'une seule lettre comme par exemple $q.

L'exemple ci-dessus envoie un simple "Hello monde" au navigateur qui appelle. Comme toujours lorsqu'un script CGI envoie quelque chose au navigateur appelant, il doit d'abord créer un entête HTTP. Le module CGI dispose pour le faire d'une fonction ou plutôt méthode nommée header(). Quand aucun argument n'est transmis à cette méthode, elle crée un entête HTTP pour le Autre page d'information type Mime text/html, à savoir pour la sortie de code HTML. Dans l'exemple ci-dessus, du texte non formaté doit toutefois être envoyé. C'est la raison pour laquelle le type Mime text/plain est transmis à la fonction.

Au vu de l'exemple de l'appel de header() vous pouvez vous rendre compte comment fonctionne l'accès à la scalaire définie auparavant. Selon le schéma $Scalaire->méthode vous "pointez" sur la méthode, et cela avec la scalaire qui est liée à une instance déterminée de l'objet CGI créée au préalable.

Pour l'envoi de l'entête HTTP et du texte "Hello monde" à sortir la fonction Perl habituelle Autre page d'information print est utilisée dans l'exemple. Cette fonction peut sortir simultanément plusieurs arguments séparés par des virgules. Dans l'exemple elle sort d'abord la valeur renvoyée par la méthode header(), à savoir l'entête HTTP désiré et ensuite le texte Hello monde.

 vers le hautvers le bas 

Sorties HTML avec le module CGI

Le module CGI dispose de ses propres méthodes pour envoyer du code HTML au navigateur.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

my $auteur = "Marco Polo";
$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');

print $cgi->header(),
      $cgi->start_html('Carnet de voyage au Cap Ferret'),
      $cgi->h1('Carnet de voyage au Cap Ferret'),
      $cgi->p('La plus grande dune de sable en Europe a 117m de haut et
      peut être vue par temps clair quand on se trouve sur le bord du bassin
      d'Arcachon. Cap Ferret lui-même est un petit coin de campagne qui est
      avant tout constitué de maisons de vacances. L'ostréiculture, la pêche
      et le sport nautique imprègnent l'atmosphère du bassin d'Arcachon.'),
      $cgi->hr({-noshade => undef, -size => '1'}),
      $cgi->p({-style => 'color:red'}, "auteur: ", $cgi->i($auteur)),
      $cgi->end_html();

Explication:

Tout d'abord le module CGI est incorporé comme d'habitude avec use CGI. Pour l'utiliser dans un style orienté sur l'objet, une nouvelle instance de l'objet CGI est créée avec $cgi = new CGI. L'exemple ne fait rien d'autre que d'envoyer un petit fichier HTML complet au navigateur. D'abord l'entête HTTP pour HTML est créé avec $cgi->header(). Puis suit le code HTML.

Le code HTML n'est cependant pas noté comme d'habitude, mais par l'appel de méthodes que le module CGI met à disposition. Pour tous les éléments HTML courants et repères HTML, ce genre de méthodes existe. Ici vous pouvez soit créer l'élément HTML complet, soit uniquement le repère d'ouverture ou de fermeture. L'instruction $cgi->h1('Carnet de voyage au Cap Ferret') crée par exemple un élément HTML complet avec son contenu. Le code créé donne <h1>Carnet de voyage au Cap Ferret</h1>. Cela fonctionne de la même manière avec les autres éléments HTML. $cgi->b('texte important') créerait par exemple le code HTML <b>texte important</b>.
Avec la méthode default_dtd vous pouvez fixer l'indicateur DTD pour pouvoir structurer le document sorti conformément au standard.

Le titre de l'exemple pourrait aussi être noté de la façon suivante:
$cgi->start_h1(),"Carnet de voyage au Cap Ferret",$cgi->end_h1().
Outre la méthode de notation complète de l'élément, il y a aussi des méthodes pour ne créer qu'un repère HTML d'ouverture ou un repère HTML de fermeture. $cgi->start_h1() ne crée donc que le code HTML <h1>, et $cgi->end_h1() le code </h1>. Les méthodes correspondantes existent pour tous les éléments, donc par exemple également $cgi->start_b() et $cgi->end_b().

L'utilisation de méthodes pour les repères d'ouverture et de fermeture est indiquées quand ceux-ci sont éloignés l'un de l'autre et ont beaucoup de contenu. Ce qui est naturellement le cas avant tout pour <html>...</html> car l'élément inclut le fichier HTML complet. La méthode $cgi->start_html(), qui est aussi utilisée dans l'exemple a cependant une place particulière. Elle ne crée pas seulement un repère d'ouverture <html> mais elle écrit aussi l'entête standard du fichier HTML avec les éléments head et title. L'argument qui lui est transmis est écrit par la méthode comme contenu de l'élément title.

De nombreux repères HTML d'ouverture ont des attributs. Pour distinguer ceux-ci du contenu de l'élément, ces méthodes proposent une syntaxe particulière. Cela se reconnaît dans l'exemple ci-dessus à la ligne de séparation. Avec l'instruction: $cgi->hr({-noshade => undef, -size => '1'}) le code HTML <hr noshade size="1"> est créé. L'argument qui est transmis à la méthode doit pour cela figurer entre des parenthèses accolades { ou }. Chaque attribut est introduit par un signe moins -. Les affectations de valeur aux attributs sont séparées de l'attribut par l'opérateur =>. Plusieurs attributs sont comme dans l'exemple de hr séparés par des virgules à l'intérieur des parenthèses accolades.

Les méthodes pour la création d'éléments HTML peuvent aussi se voir transmettre plusieurs arguments. Pour le faire, vous devez séparer les arguments par des virgules. Vous en voyez un exemple plus complexe dans la dernière instruction $cgi->p(...). Cet appel de la méthode transmet trois arguments. Le premier argument est un attribut pour le repère d'ouverture <p>, à savoir un attribut style, dans lequel la couleur rouge de la police est définie. Le deuxième élément est un texte statique et le troisième argument montre deux autres possibilités: il contient un autre appel pour une méthode élément, à savoir $cgi->i() pour du texte en italique. Et l'argument transmis à cette méthode n'est pas un texte statique mais une scalaire nommée $auteur, qui est définie plus haut dans l'exemple.

Les arguments permettent donc l'imbrication commode d'éléments HTML, tout comme l'insertion de contenus variables qui ont été recherchés au préalable par le script.

Attention:

L'incorporation du module CGI ne vous impose en aucun cas de créer du code HTML de cette façon. Vous pouvez aussi générer directement les sorties HTML avec la fonction print ou sortir des modèles lus auparavant. Vous pouvez aussi panacher les appels de méthodes du module CGI avec de la création commune de code HTML. Il n'y a donc aucun problème à noter des formes panachées comme celle-ci:
print "<hr noshade size='1'>",
      $cgi->p({-style => 'color:red'}, "auteur: <i>$auteur</i>");

En principe, tous les noms d'éléments HTML à l'intérieurs de méthodes sont écrits en minuscules, donc par exemple start_div(), end_div() ou bien div(). Il existe toutefois quelques exceptions pour éviter des heurts avec des parties constituantes de Perl du même nom. Les éléments HTML Tr, Select, Link et Sub commencent par une majuscule donc par exemple dans une instruction comme:
$cgi->Sub('texte en indice').

Vous pouvez poser des commentaires HTML avec la méthode comment(). Ainsi l'instruction:
$cgi->comment('pas d'actualité pour l'instant')
crée le code HTML:
<!--pas d'actualité pour l'instant-->.

 vers le hautvers le bas 

Mentions avancées pour l'entête HTTP et pour l'entête de fichier HTML

Les entêtes HTTP peuvent nécessiter parfois des informations supplémentaires. Et en ce qui concerne l'entête HTML, celui-ci peut de la même façon contenir des mentions générales importantes sur le fichier HTML, par exemple des repères Meta ou des attributs sur la mise en page dans le repère d'ouverture <body>.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');

print $cgi->header(-type    =>'text/html',
                   -expires =>'+1h'),
      $cgi->start_html(-title  =>'Page de test avec un lien',
                       -author =>'selfhtml@fr.selfhtml.org',
                       -base   =>'true',
                       -target =>'_blank',
                       -meta   =>{'keywords'   =>'selfhtml, test',
                                  'description'=>'un petit test avec un lien'},
                       -style  =>{'src'=>'/styles/formate.css'},
                       -BGCOLOR=>'#FFFFCC',
                       -TEXT   =>'#000000',
                       -LINK   =>'red',
                       -VLINK  =>'blue',
                       -ALINK  =>'black'),
      $cgi->p('un petit test avec ',
              $cgi->a({-href => 'http://actuel.fr.selfhtml.org/'},'Lien à  fr.selfhtml.org')),
      $cgi->end_html();

Explication:

Le script incorpore le module CGI avec use CGI et crée une nouvelle instance de l'objet CGI avec $cgi = new CGI. Pour la vers le haut sortie HTML, qu'il crée ensuite, il utilise différentes possibilités pour influer sur l'entête HTTP et sur les données de l'entête de fichier HTML.

Vous pouvez transmettre plusieurs arguments aussi bien à la méthode header() pour la création de l'entête HTTP qu'à la méthode start_html() pour la création de l'entête HTML. Les deux méthodes connaissent chacune un argument standard: pour header() il s'agit du type Mime, et pour start_html() le contenu de l'élément title. C'est pourquoi vous pouvez mentionner ces arguments sans précaution particulière, donc par exemple sous la forme header('text/plain') ou bien start_html('Texte du titre'). Pour la mention de plusieurs autres arguments, vous devez cependant utiliser la syntaxe montrée ci-dessus. Ici chaque argument est constitué d'un nom de paramètre, introduit par un signe moins -, d'un opérateur flèche => et de la valeur souhaitée. Les deux tableaux suivants dressent la liste des arguments possibles.

Arguments pour l'entête HTTP

Le tableau suivant fait la liste des mentions que vous pouvez noter pour l'entête HTTP. Les exemples de code dans la colonne de gauche représentent seulement le simple appel de la méthode header().

Exemple d'appel Explication
header(-type=>'image/gif'); Avec -type vous pouvez déterminer le type Mime du flux de données qui suit. Dans l'exemple vous pouvez ensuite sortir les données binaires d'un graphique GIF (pour le faire appeler auparavant éventuellement la fonction Autre page d'information binmode!)
header(-status=>'204 No response'); Avec -status vous pouvez envoyer un message d'état HTTP au navigateur. Avec l'instruction en exemple (HTTP-Status 204) vous pouvez refuser la sortie d'autres données vers le navigateur. Chez l'utilisateur, le page affichée en dernier reste affichée à l'écran. Cela est judicieux par exemple quand l'utilisateur déclenche un script de vote en cliquant sur un lien, qui ne doit pas l'empêcher néanmoins de lire le reste de la page.
print $cgi->header(-expires=>'+120s'); Avec -expires vous pouvez obtenir que le navigateur accepte la sortie HTML dans sa mémoire cache pour une durée minimale. Lors d'un nouveau chargement (actualisation) de la page sortie dans le laps de temps mentionné, le navigateur n'appelle alors plus le script mais prend le code HTML de son cache. Mentionnez la durée sous forme de nombre avec un signe plus qui le précède et une lettre qui le suit exprimant l'unité de temps. La mention '+30s' fr l'exemple signifie "conserver le code HTML dans le cache pendant 30 secondes". Les autres unités de temps sont m (minutes), h (heures), d (jours), M (mois) et y (années). En plus de cela, des mentions de temps absolues sont permises comme par exemple Friday, 08-Jun-2001 11:29:00 GMT+0100.
print $cgi->header(-cookie=>$Cookie); Avec -cookie vous pouvez activer un témoin de connexion. De plus amples détails à ce sujet dans la partie vers le bas Gérer les témoins de connexion (Cookies) avec le module CGI.
print $cgi->header(-nph=>1); Avec cette commande, vous pouvez écrire ce qu'on appelle des scripts NPH. NPH figure pour no-parsed-header et signifie que le script CGI envoie directement les données qui suivent au navigateur sans que le serveur Web n'en sache rien. Cela peut conduire à des gains de performance et dans certains cas, par exemple pour l'utilisation du serveur Web IIS, il est même prescrit d'utiliser le mode NPH.

Arguments pour l'entête de fichier HTML

Le tableau suivant dresse la liste des mentions que vous pouvez noter pour l'entête de fichier HTML. . Les exemples de code dans la colonne de gauche représentent seulement le simple appel de la méthode start_html().

Exemple d'appel Explication
start_html(-title=>'Texte du titre'); Avec -title vous déterminez le Autre page d'information titre de la sortie HTML. L'exemple crée le code HTML suivant:
<TITLE>Texte du titre</TITLE>
start_html(-author=>'selfhtml@fr.selfhtml.org'); Avec -author vous créez une Autre page d'information relation logique à une adresse électronique. L'exemple crée le code HTML suivant:
<LINK REV=MADE HREF="mailto:selfhtml%40fr.selfhtml.org">
start_html(-base=>'http://myserver.com/'); Avec -base vous déterminez l' Autre page d'information adresse de base de la page HTML sortie. L'exemple crée le code HTML suivant:
<BASE HREF="http://myserver.com/">
start_html(-target=>'dataframe'); Avec -target vous déterminez le Autre page d'information nom de la fenêtre de base pour les liens dans la sortie HTML. L'exemple crée le code HTML suivant:
<BASE TARGET="dataframe">
start_html(-meta=>{'keywords'=>'HTML,CSS'}); Avec -meta vous pouvez noter des mentions Meta - seulement celles toutefois, qui en HTML sont du type name=, et non pas celles qui sont du type http-equiv. Plusieurs mentions Meta simultanées sont permises. Chaque mention Meta distincte doit figurer dans des parenthèses accolades. Dans les parenthèses accolades, vient d'abord la valeur qui, en HTML, serait affectée à l'attribut name, suivie de l'opérateur => et de la valeur que vous attribueriez en HTML à l'attribut content. L'exemple crée le code HTML suivant:
<META NAME="keywords" CONTENT="HTML,CSS">
start_html(-BGCOLOR=>'#000000'); Avec tous les autres arguments qui commencent par le signe moins et qui n'ont aucun des autres noms réservés comme -title ou bien -meta, vous fixez des attributs qui sont insérés dans le repère d'ouverture <body>. L'exemple crée le code HTML suivant:
<BODY BGCOLOR="#000000">

 
 vers le hautvers le bas 

Traitement de formulaires avec le module CGI

Beaucoup de scripts CGI sont appelés par des formulaires HTML. Une des tâches les plus importantes du module CGI est de ce fait de lire les données du formulaires transmises au script et de les tenir à disposition sous une forme pratique. L'exemple suivant est le même que celui de la partie Autre page d'information Exemple pour l'échange alterné entre HTML et CGI, en utilisant cette fois cependant le module CGI.

Exemple: fichier HTML avec appel CGI

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Page de commentaire</title>
</head>
<body bgcolor="#E0E0E0" text="#000000">
<h1>Votre commentaire</h1>
<form action="/cgi-bin/comments.pl" method="post">
<p>Name:<br><input size="40" maxlength="40" name="utilisateur"></p>
<p>Text:<br><textarea rows="5" cols="50" name="commentaire"></textarea></p>
<p><input type="submit" value="envoyer"></p>
</form>
</body>
</html>

Exemple: script CGI complet comments.pl avec sortie HTML

#!/usr/bin/perl -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

my @noms_champ = $cgi->param();

print $cgi->header(),
      $cgi->start_html('avis CGI du programme '),
      $cgi->h1('avis CGI du programme ',$cgi->i('comments.pl'));
      foreach my $champ (@noms_champ) {
        print $cgi->b('nom de champ: '),
              $champ,
              $cgi->b(', contenu: '),
              $cgi->param($champ), "<br>";
      }
print $cgi->end_html();

Explication:

Le fichier HTML contient un formulaire qui appelle le script CGI comments.pl dans le repère d'ouverture <form> avec l'attribut action. La méthode de transmission choisie dans l'exemple est post. L'autre méthode, à savoir get, serait tout aussi possible. Le module CGI reconnaît automatiquement la méthode de transmission.

Le script CGI comments.pl lit simplement les données transmises et les renvoie formatées en HTML au navigateur appelant. Pour ce faire, le script incorpore d'abord le module CGI avec use CGI et crée une nouvelle instance de l'objet CGI avec $cgi = new CGI. Ensuite, l'accès aux méthodes de l'objet CGI est possible par la scalaire $cgi. La méthode param() est décisive pour le traitement du formulaire. Grâce à elle, le script peut aller chercher les données transmises.

Pour la méthode param tout dépend dans quel contexte elle est appelée. La valeur qu'elle renvoie en dépend. Dans l'exemple ci-dessus, c'est l'instruction @noms_champ = $cgi->param(). Il s'agit ici d'un contexte de liste, c'est à dire que la valeur renvoyée attendue est une liste. Avec ce genre d'appels, param() renvoie la totalité des noms de champs d'un formulaire lu. Il s'agit des noms ayant été fixés dans le formulaire HTML lors de la définition des champs de formulaire avec l'attribut name=. La recherche de tous les noms de champs dans une liste est pratique dans la mesure où ces noms peuvent être transmis par la suite comme paramètres à la méthode param(). Dans la vers le haut sortie HTML du script, un tel appel de param() est contenu. Là est notée l'instruction $cgi->param($champ). Quand un nom de champ est transmis comme paramètre à param(), La méthode renvoie la valeur correspondante ou le contenu du champ. Le contexte est ensuite scalaire. Dans l'exemple ci-dessus, tous les noms de champs sont parcourus dans l'ordre dans la boucle foreach $champ (@noms_champ). Avec $cgi->param($champ) il peut alors être accédé au contenu respectivement actuel de chacun des champs du formulaire.

Le tableau suivant récapitules les possibilités d'appel de param().

Exemple d'appel Valeur renvoyée Explication
if($cgi->param()) liste, évaluée en contexte booléen (true ou false) Un tel appel exprimé sous la forme d'une condition if recherche si des données ont été ou non transmises au formulaire. Ce qui est intéressant quand un script peut être appelé de plusieurs contextes différents, et qu'il faut d'abord établir s'il a reçu des données ou non. Dans l'embranchement if, les données du formulaire peuvent être lues et dans l'embranchement else peuvent figurer des instructions pour le cas où aucune donnée de formulaire a été transmise.
$valeur = $cgi->param('nom_utilisateur') scalaire Renvoie la valeur ou le contenu d'un champ nommé nom_utilisateur. Cette forme de notation est intéressante quand vous connaissez en tant qu'auteur du script les noms de champ se rapportant aux données du formulaire transmises et que vous désirez rechercher directement la valeur ou le contenu du champ concerné.
@noms = $cgi->param() liste renvoie tous les noms de champ d'un formulaire.
$cgi->param($noms[2]) scalaire Renvoie la valeur ou le contenu du troisième champ du formulaire ($noms[0] serait le premier champ du formulaire), dans la mesure où dans un premier temps les noms de champ ont été sauvegardés comme liste avec @noms = $cgi->param().
@composants $cgi->param('composant') liste Renvoie la valeur ou le contenu d'un groupe de champs de formulaire du même nom - cette variante d'appel est importante avant tout pour les cases à cocher dans les formulaires HTML. Dans la liste @composants figurent ensuite tous les composants qu'un utilisateur a cochés dans les éléments cases à cocher portant l'attribut name="composant".

 
 vers le hautvers le bas 

Rechercher les données d'environnement avec le module CGI

Un script CGI a fréquemment besoin d'informations sur son environnement, par exemple sur le serveur, le navigateur appelant ou sur son propre emplacement de sauvegarde sur le serveur. Le module CGI dispose de différentes méthodes pour la recherche de ces données. Nombre d'entre elles ne donnent que des détails extraits des Autre page d'information variables prédéfinies %ENV.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');
print $cgi->header(),
      $cgi->start_html('donnees_environnement'),
      $cgi->start_table({-border => '1'}),
        $cgi->Tr($cgi->th({-align => 'right'},'URI du script:'),
                 $cgi->td($cgi->url(-full => 1))),
        $cgi->Tr($cgi->th({-align => 'right'},'URI relative du Script:'),
                 $cgi->td($cgi->url(-relative => 1))),
        $cgi->Tr($cgi->th({-align => 'right'},'logiciel du serveur:'),
                 $cgi->td($cgi->server_software())),
        $cgi->Tr($cgi->th({-align => 'right'},'logiciel du navigateur:'),
                 $cgi->td($cgi->user_agent())),
      $cgi->end_table(),
      $cgi->end_html();

Explication:

Le script en exemple incorpore d'abord le module CGI avec use CGI et crée une nouvelle instance de l'objet CGI avec $cgi = new CGI. Ensuite, il envoie du code HTML au navigateur, à savoir un tableau avec quelques informations sur l'environnement. Les vers le haut sorties HTML sont réalisées à l'aide des méthodes du module CGI et de leurs règles. Le tableau sorti dresse la liste dans la colonne de gauche dans un élément th, de l'information que chaque ligne respective que le tableau contient et dans la colonne de droite dans un élément td de la valeur correspondante. Cette valeur est recherchée à chaque fois avec une méthode du module CGI. Ainsi par exemple l'URI du script est-elle recherchée avec $cgi->url(-full => 1).

Le tableau suivant dresse la liste des méthodes disponibles pour les données d'environnement. Les exemples d'appels supposent qu'une instance de l'objet CGI a été créée avec $cgi = new CGI . Le tableau est trié par ordre alphabétique des noms de méthodes.

Méthode Valeur renvoyée Explication
$cgi->Accept() liste Recherche une liste des Autre page d'information types Mime, acceptés par le navigateur appelant. Ce qu'il est intéressant de vérifier avant qu'un script ne veuille envoyer des données à d'un type Mime peu courant au navigateur. Il se peut que la liste ne contienne qu'un élément avec la valeur */*. Ce qui implique que le navigateur accepte potentiellement tous les types Mime.
$cgi->auth_type() scalaire Recherche le type d'authentification de l'utilisateur dans la mesure où l'accès du script est protégé et que celui-ci ne peut être appelé qu'en entrant les données d'accès correspondantes.
$cgi->path_info() scalaire Recherche des mentions supplémentaires notées comme d'autres sous-répertoires. Quand le script a par exemple l'adresse http://ma.page.net/cgi-bin/test.pl mais est appelé avec http://ma.page.net/cgi-bin/test.pl/querys/musicbase.sql, alors cette commande trouve la partie correspondant à /querys/musicbase.sql. Ne perdez pas de vue que les appels de ce genre ne sont pas traités correctement par tous les serveurs Web.
$cgi->path_translated() scalaire Recherche comme $cgi->path_info() des mentions supplémentaires notées comme d'autres sous-répertoires à cette différence près cependant que ce n'est pas la partie de l'URI qui est renvoyée mais la traduction par le Serveur Web du chemin de cette partie. Supposons que le script ait l'adresse http://ma.page.net/cgi-bin/test.pl, mais qu'il ait été appelé avec http://ma.page.net/cgi-bin/test.pl/querys/musicbase.sql. Alors, cette partie supplémentaire de l'adresse /querys/musicbase.sql pourrait être résolue par rapport au serveur Web en une mention de chemin physique telle que /usr/web/page/querys/musicbase.sql. Ce nom de chemin serait alors renvoyé par $cgi->path_translated() .
$cgi->referer() scalaire Recherche l'URI de la page affichée dans le navigateur et à partir de laquelle le script CGI a été appelé. Une telle valeur peut être recherchée quand le script a été appelé à l'envoi d'un formulaire ou par un lien.
$cgi->remote_host() scalaire Recherche le nom de domaine de l'accès à Internet (s'il est disponible) ou de l'adresse IP de l'accès du navigateur appelant.
$cgi->remote_user() scalaire Recherche le nom d'utilisateur avec lequel l'utilisateur appelant s'est identifié pour appeler le script. Quand par exemple le script est protégé htaccess, l'utilisateur appelant doit s'annoncer avec identification et mot de passe. Le nom de l'utilisateur entré ici peut être recherché avec cette commande.
$cgi->request_method() scalaire Recherche la méthode HTTP avec laquelle le script CGI a été appelé, renvoie donc habituellement GET ou bien POST.
$cgi->script_name() scalaire Recherche le chemin HTTP absolu du script CGI. Pour un script avec l'adresse http://ma.page.net/cgi-bin/test.pl ce serait donc /cgi-bin/test.pl qui serait trouvé. Cette valeur est très bien appropriée pour d'autres appels du script par lui-même par exemple pour des applications de plusieurs pages comme des procédures de commandes.
$cgi->server_name() scalaire Recherche le nom de l'ordinateur serveur sur lequel tourne le script CGI. En principe il s'agit du nom d'hôte enregistré de l'ordinateur.
$cgi->server_software() scalaire Recherche le nom et le numéro de version du logiciel de serveur Web de l'ordinateur serveur.
$cgi->url(-full => 1) scalaire Recherche l'adresse complète du script CGI mais sans les paramètres lui ayant été éventuellement transmis.
$cgi->url(-path => 1) scalaire Recherche des mentions supplémentaires notées comme d'autres sous-répertoires. Quand le script a par exemple l'adresse http://ma.page.net/cgi-bin/test.pl, mais est appelé avec http://ma.page.net/cgi-bin/test.pl/data/musicbase , alors cette commande trouve la partie /data/musicbase. Ne perdez pas de vue que les appels de ce genre ne sont pas traités correctement par tous les serveurs Web.
$cgi->url(-query => 1) scalaire Recherche l'adresse complète propre au script CGI y compris les paramètres lui ayant été éventuellement transmis. Pour des appels tels que http://ma.page.net/cgi-bin/test.pl?user=Nougaro&souhait=chansons la partie derrière le point d'interrogation est donc également renvoyée.
$cgi->url(-relative => 1) scalaire Recherche le chemin HTTP relatif du script CGI par rapport au répertoire de travail actuel.
$cgi->url_param() liste Recherche la liste de tous les noms de paramètres, dans la mesure où des paramètres ont été transmis. Pour un appel du script comme http://ma.page.net/cgi-bin/test.pl?user=Nougaro&souhait=chansons c'est donc une liste avec les deux éléments user et souhait qui est trouvée
$cgi->url_param('wunsch') scalaire Recherche la valeur d'un paramètre nommé souhait transmis au script. Pour un appel du script comme http://ma.page.net/cgi-bin/test.pl?user=Nougaro&souhait=chansons c'est donc chansons qui est trouvé.
if($cgi->url_param()) liste, évaluée en contexte booléen Recherche si des données quelconques ont été transmises au script par l'URI. Dans l'embranchement if peuvent figurer des instructions qui correspondent à ce cas, tandis que dans l'embranchement else on peut déduire qu'aucun paramètre n'a été transmis.
$cgi->user_agent() scalaire Recherche la désignation avec laquelle le navigateur appelant s'est identifié après du serveur. Les valeurs typiques trouvées peuvent être Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) (pour l'Explorer Internet MS 5.5).
$cgi->user_name() scalaire Recherche le nom de l'utilisateur appelant à l'aide de différentes requêtes. Les navigateurs modernes empêchent il est vrai, le piratage de ces données.
$cgi->virtual_host() scalaire Recherche le nom de domaine avec lequel le navigateur a appelé le script CGI.

 
 vers le hautvers le bas 

Gérer les témoins de connexion (Cookies) avec le module CGI

Les témoins de connexion sont des petites unités d'informations qu'une page Web peut sauvegarder sur le navigateur appelant. La sauvegarde et la gestion sont ici assurées par le navigateur de l'utilisateur. Les témoins de connexion permettent de sauvegarder des informations propres à l'utilisateur, comme l'heure et la date de sa dernière visite, ou des offres qu'il a cliquées pour les relire lors du prochain appel. Le module CGI soutient la pose et la lecture de ces témoins de connexion.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

my $CTIME_String = localtime(time);
my $vieux_temoin = $cgi->cookie(-name=>'derniere_visite');
my $nouveau_temoin = $cgi->cookie(-name=>'derniere_visite',
                            -value=>$CTIME_String,
                            -expires=>'+3M',
                            -path=>'/');

print $cgi->header(-cookie=>$nouveau_temoin),
  $cgi->start_html("Cookie-Test"),
  $cgi->p("<b>La date de votre dernière visite sur cette page remonte à</b>: ", $vieux_temoin || 'inconnu'),
  $cgi->p("<b>La nouvelle date de visite enregistrée est maintenant</b>: ", $CTIME_String),
  $cgi->end_html();

Explication:

Le script en exemple utilise un témoin de connexion à l'aide duquel il recherche la date et l'heure du dernier appel de la page et sauvegarde la date et l'heure actuelle comme nouveau dernier appel. Pour le contrôle, il génère une vers le haut sortie HTML, dans laquelle le visiteur apprend quelle est l'ancienne date d'appel et quelle est celle qui vient d'être sauvegardée. Pour ce faire le script incorpore dans un premier temps le module CGI avec use CGI et crée une nouvelle instance de l'objet CGI avec $cgi = new CGI. Avec Autre page d'information localtime(time) il recherche la date et l'heure actuelle et les sauvegarde dans la scalaire $CTIME_String. La lecture du témoin de connexion sont dirigées par la méthode cookie() du module CGI. Par la scalaire $cgi qui est liée à j'objet CGI créé, le script accède à la méthode avec $cgi->cookie().

La méthode cookie() attend des arguments. Selon les arguments qui lui sont transmis, elle lit un témoin de connexion existant ou en définit un nouveau. Tous les arguments se composent d'un nom d'argument et d'une valeur. Le nom d'argument commence par un signe moins -. Derrière le nom d'argument suit l'opérateur => suivi lui-même de la mention de la valeur souhaitée.

Pour la lecture, il suffit de mentionner l'argument -name. Si un témoin de connexion de ce nom existe, alors l'appel de cookie() renvoie sa valeur. C'est exactement ce qui se passe dans le premier appel de l'exemple ci-dessus. La valeur renvoyée est sauvegardée dans la scalaire $vieux_temoin. Dans l'exemple, le témoin de connexion a pour nom derniere_visite.

Pour la pose d'un témoin de connexion il vous faut transmettre au moins deux arguments à cookie(), à savoir les arguments -name et -value. Pour -value mentionnez la valeur devant être sauvegardée. Dans l'exemple ci-dessus, il s'agit du contenu de la scalaire calculée précédemment $CTIME_String. La seule mention de -value ne suffit pas à poser le témoin de connexion. Cela ne devient effectif qu'en envoyant l'entête HTTP au navigateur appelant. Pour le faire, la valeur renvoyée de l'appel de cookie() est tout d'abord sauvegardée et ce dans la scalaire $nouveau_temoin. Cette scalaire est ensuite envoyée comme valeur dans l'argument -cookie que vous envoyez ensuite au navigateur avec la méthode header() comme c'est indiqué dans l'exemple ci-dessus.

Un autre argument important de la méthode cookie() est -expires. Il vous permet de mentionner combien de temps le navigateur doit sauvegarder le témoin de connexion chez l'utilisateur. Quand vous ne mentionnez pas -expires, le navigateur ne conserve le témoin de connexion que jusqu'à ce que l'utilisateur ferme le navigateur. La période souhaitée pour la sauvegarde est à mentionner sous forme de chiffre précédé du signe plus et suivi d'une lettre pour indiquer l'unité de temps. La mention '+3M' de l'exemple signifie "3 mois". Les autres unités de temps sont s (secondes), m (minutes), h (heures), d (jours) et y (année). En plus de cela, les mentions de temps absolues au format UTC sont permises comme par exemple Friday, 08-Jun-2001 11:29:00 GMT+0100.

La méthode cookie() connaît en outre encore d'autres arguments. Avec -path vous mentionnez le chemin HTTP sur le serveur pour lequel ainsi que pour ses répertoires, le témoin de connexion doit s'appliquer. Si la mention manque, le témoin de connexion s'applique à tout le domaine à partir de le racine des documents. Avec -domain vous pouvez mentionner à quel sous-domaine, dans le domaine principal, le témoin de connexion doit s'appliquer (par exemple -domain => nouvelles.surceserveur.fr). Avec -secure, qui attend comme affectation de valeur true, donc par exemple 1 , vous obtenez que le témoin de connexion ne soit posé que si l'environnement serveur est un environnement sécurisé SSL. C'est important quand vous transmettez des données sensibles dans le témoin de protection, par exemple le numéro de carte de crédit de l'utilisateur pour le lui proposer lors de sa prochaine visite comme occupation par défaut d'un champ de formulaire.

 vers le hautvers le bas 

Ré-acheminements automatiques avec le module CGI

Certains scripts servent à diriger l'utilisateur appelant sur une autre adresse et à régler auparavant éventuellement quelques tâches.

Exemple d'un script CGI complet en Perl:

#!/usr/bin/perl -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);

open(FH,">>/usr/web/data/userlog.xml");
print FH "<user-call>\n <remote-host>",
         $cgi->remote_host(),
         "</remote-host>\n <user-agent>",
         $cgi->user_agent(),
         "</user-agent>\n <goto-url>",
         $cgi->url_param('goto'),
         "</goto-url>\n <time-stamp>",
         localtime(time),
         "</time-stamp>\n</user-call>\n";
close(FH);

print $cgi->redirect($cgi->url_param('goto'));

Explication:

Le script en exemple attend à son appel un paramètre nommé goto dans l'URI auquel doit être affectée une adresse valide. Supposons que le script ait l'adresse "http://localhost/cgi-bin/redirect.pl", alors un appel concevable serait http://localhost/cgi-bin/redirect.pl?goto=http%3A%2F%2Factuel.fr.selfhtml.org/. Un tel appel pourrait par exemple figurer comme attribut href dans un lien qui mène l'utilisateur vraiment à actuel.fr.selfhtml.org/ mais en réunissant auparavant quelques renseignements sur l'utilisateur.

Le script incorpore dans un premier temps le module CGI avec use CGI et crée une nouvelle instance de l'objet CGI avec $cgi = new CGI. Le ré-acheminement est ensuite possible comme il est montré dans la toute dernière instruction de l'exemple avec print $cgi->redirect(). L'adresse désirée sur laquelle la déviation doit se faire est transmise comme argument à la méthode redirect(). Dans l'exemple, ce n'est pas une adresse statique qui est transmise mais la valeur obtenue de la vers le haut variable d'environnement url_param('goto'). La valeur transmise par goto à l'appel du script y est contenue. Le script ne fait donc rien d'autre du point de vue de l'utilisateur que d'appeler l'adresse transmise.

Auparavant, le script écrit cependant quelques données concernant l'utilisateur dans un fichier XML. Dans ce fichier sont écrites des données comme le nom d'hôte, l'adresse IP de l'utilisateur, le type de son navigateur, l'adresse de ré-acheminement et les date et heure actuelles, recherchées avec Autre page d'information localtime(time). Pour ouvrir et fermer le fichier, le script utilise les fonctions Perl habituelles Autre page d'information open et Autre page d'information close. Les données sont écrites comme d'habitude avec Autre page d'information print et la mention du descripteur de fichier (dans l'exemple FH).

 vers le hautvers le bas 

Réglages de sécurité avec le module CGI

Le module CGI propose deux possibilités de réglage importantes avec lesquelles vous pouvez augmenter la sécurité d'un script CGI contre une utilisation délictueuse. Vous devez noter les deux commandes au début du script après avoir incorporé néanmoins le module CGI avec use CGI.

Commande Explication
$CGI::POST_MAX = 1024 * 100; Avec cette commande, vous fixez la quantité maximale de données pouvant être transmise au script CGI. Dans l'exemple un nombre est calculé qui exprime des octets, à savoir 100 Kilooctets. Si le valeur est dépassée, la liste de paramètres est effacée. Le code d'erreur correspondant est renvoyé par la méthode cgi_error.
$CGI::DISABLE_UPLOADS = 1; Avec cette commande, vous pouvez empêcher que des fichiers qui sont transmis au script par formulaire, donc par des repères HTML du genre <input type="file">, soient sauvegardés automatiquement dans un fichier temporaire. Les données correspondantes du formulaire sont donc tout simplement sautées lors de l'évaluation. Une telle commande est intéressante par exemple quand le script ne sait pas d'avance d'où il est appelé et quelles données de formulaire il doit traiter - par exemple un formulaire courriel accessible au public qui envoie des formulaires HTML remplis quelconques à une adresse électronique.

 
 vers le haut
page suivante Autre page d'information Ordinateur et langage écrit
page précédente Autre page d'information Modules CPAN
 

© 2001 Stefan Münz / © 2003 Traduction Adresse électronique Serge François, 13405@free.fr
Adresse électronique selfhtml@fr.selfhtml.org