Você está na página 1de 14

Rapport

technique

1
1. Introduction aux applications dynamiques:
L'une des caractéristiques les plus remarquables mises à notre disposition par les serveurs Web
actuels est la possibilité de développer des applications ou des scripts que les utilisateurs distants
démarrent en cliquant sur des liens HTML ou en remplissant et envoyant un formulaire HTML.
Avec des langages de programmation tels que Perl ou le C, on peut créer des applications ou des
scripts capables de communiquer avec l'utilisateur dans des pages HTML dynamiques.

Les applications et les scripts peuvent être écrits dans pratiquement tous les langages de
programmation 32 bits, par exemple Perl, ou sous forme de fichiers de commandes Windows NT
(fichiers ayant l'extension.bat ou .cmd). Lorsque nous écrivons nos applications ou scripts nous
pouvons utiliser l'interface prise en charge par tous les serveurs : CGI (Common Gateway
Interface). En outre le Serveur Web de Microsoft (IIS 3) propose une autre interface : ISAPI
(Microsoft Internet Server Application Programming Interface), la documentation de ISAPI est
disponible sur commande auprès de MSDN (Microsoft Developer Network).

Les applications qui utilisent l'interface CGI sont efficaces parce que chaque script est exécuté
dans son propre espace mémoire, cette caractéristique ne joue pas en faveur de la vitesse
d'exécution. En revanche, les applications qui utilisent ISAPI sont compilées en tant que DLL
(dynamic-link libraries) et chargées par le service WWW à son démarrage. Du fait que les
programmes restent en mémoire, les programmes ISAPI sont sensiblement plus rapides que les
applications écrites suivant les spécifications CGI.

L'essentiel de ce rapport parlera de scripts CGI, cependant, une brève introduction aux
spécifications ISAPI se trouve au point 7. en fin de ce même rapport.

2. La définition d'un script CGI :


Common : Utilisable dans tous les systèmes d'exploitation et avec tous les langages de
programmation.
Gateway : CGI dans accès aux services
Interface : CGI est un protocole formellement spécifié.
En simplifiant, un script CGI est tout simplement un programme pouvant être exécuté par un
serveur HTTP.
3. Pourquoi utiliser les scripts CGI :
Nous savons créer des pages au format HTML (Hyper Text Markup Language) et les publier sur
le WEB (World Wide Web). Ainsi, Nous maîtrisons les bases de HTML, et nous sommes alors
prêt(e) à passer à l'étape suivante: la création et gestion de pages dynamiques, et l'interfaçage
avec des programmes externes.
Nous pourrons alors effectuer des traitements automatiques à partir de nos pages HTML. Un
exemple classique nous étant fourni par les moteurs de recherche qui, à partir de mots clés saisis
dans un formulaire, nous affichent l'ensemble des pages au format HTML contenant ces mots
clés. La recherche étant effectuée par un programme externe.

2
La solution est l'utilisation de la Common Gateway Interface (CGI). CGI est une interface
permettant l'exécution de programmes externes par un serveur HTTP. Plus généralement, CGI est
en fait un standard pour l'écriture de passerelles entre des serveurs d'informations tel que HTTP et
des programmes externes. L'interface CGI permet de faire communiquer le programme et le
serveur HTTP. Un explorateur Web client peut démarrer une application CGI en remplissant un
formulaire HTML ou en cliquant sur un lien dans une page HTML de notre serveur. L'application
CGI peut récupérer les informations fournies par l'explorateur Web et exécuter pratiquement tout
ce qui peut être programmé, puis renvoyer les résultats dans une page HTML ou les enregistrer
dans une base de données.
4. Pré Requis et choix techniques :
Du fait que les applications CGI simples sont souvent écrites à l'aide de langage de script comme
Perl, elles sont souvent appelées « scripts ».Donc, pour l'écriture des programmes, la
connaissance d'un langage de programmation plus ou moins évolué est bien entendu nécessaire
(par exemple, C, Perl, ...).
Autant l'écriture de pages au format HTML nécessitait juste un navigateur pour visualiser le
résultat, autant l'écriture de scripts CGI nécessite la présence d'un serveur HTTP tournant sur la
machine (en effet, n'oublions pas que c'est le serveur qui exécute le programme). Donc, première
étape, il nous faut installer un serveur HTTP.

5. Notions fondamentales :
Lorsque nous tapons un URL (Uniform Ressource Locator), par exemple :
http://www.u picardie.fr/index.html, notre navigateur préféré va se connecter au serveur Web
indiqué, c'est à dire le programme installé sur la machine distante (dans notre exemple www.u-
picardie.fr), et qui écoute sur le port 80. Le serveur va chercher le document en question sur son
disque et l'envoie au navigateur, en utilisant le protocole HTTP (HyperText Transfer Protocol). Il
peut s'agir de n'importe quel type de fichier, un fichier au format HTML, une image, un fichier
son etc.
Pour savoir comment et où chercher le document, le serveur possède un ensemble de fichiers de
configuration chargés en mémoire à son lancement. Dans notre exemple, le serveur ira chercher
le fichier april.html dans le répertoire racine du serveur. Un autre exemple d'URL est
http://www.upicardie. fr/~cauchois/index.html. Le caractère ~ indique que la chaîne qui suit
correspond à un nom de login sur la machine du serveur. Ainsi, dans ce cas, le serveur va
chercher le document en question dans le répertoire /home/cauchois/public_html (selon la
configuration classique du serveur). Le fichier index.html se trouve dans ce répertoire. Les
utilisateurs ont ainsi la possibilité de créer un répertoire public_html (accessible en lecture et
exécution) dans leur compte pour publier sur le Web. Mais ce type de document est statique, or il
est possible d'accéder à de l'information dynamique. Une possibilité est l'utilisation de scripts
CGI. En effet, ce programme est exécuté, par le serveur, en temps réel sur la machine distante, au
moment où le navigateur fait une requête vers ce programme.
Un exemple assez puissant étant l'accès, via un formulaire HTML, à une base de données. Par
l'intermédiaire du formulaire, vous saisissez les nom et prénom d'une personne. A l'aide d'un
bouton 'valider' présent sur le formulaire, le serveur invoque alors un programme qui, à partir des

3
informations saisies dans le formulaire, va interroger le moteur de votre base de données et
envoyer en réponse un page au format HTML, contenant les informations concernant cette
personne, que votre navigateur va alors afficher.

L'illustration suivante montre comment un explorateur, un serveur et une application CGI


échangent des informations en utilisant CGI. Le reste de la présente section traite de ce processus
en cinq étapes.

Le client envoie une demande

Un explorateur client peut formuler une demande CGI à un serveur de deux façons :

GET

• Le client ajoute des données à la fin de l'URL qu'il passe au serveur.

POST

• Le client envoie des données au serveur au moyen du champ de données d'un message
HTTP, passant ainsi outre les limites de taille inhérentes à la méthode GET.

Le client déclenche un processus CGI en cliquant sur l'un des éléments suivants d'une page
HTML :

• Un lien hypertexte qui exécute le script directement.


• Le bouton « Soumettre » (ou Envoi) d'un formulaire HTML.
• Un objet en ligne chargé par la méthode GET.
• Un objet de recherche (c'est-à-dire, qui utilise le marqueur HTML ISINDEX ).

Le serveur reçoit la demande

L'URL que l'explorateur client envoie au serveur contient le nom du script CGI ou de
l'application à exécuter. Le serveur compare l'extension du nom de fichier à la clé de registre de

4
mappage de scripts du serveur, afin de déterminer quel programme exécutable il doit démarrer.
Pour permettre au serveur de démarrer une application de type CGI sans extension
correspondante, ajoutez une entrée pour ce type d'applications à la clé de registre. Par exemple,
pour que les scripts Perl puissent s'exécuter, ajoutez une entrée ressemblant à la suivante :

.pl: REG_SZ: C:\PERL\BIN\PERL.EXE %s %s

Dans cette ligne,

• \Perl\Bin\ est le répertoire contenant le programme exécutable;


• Perl.exe est la commande à exécuter;
• le premier signe %s est la traduction du chemin d'accès au script Perl (l'URL traduite en
un chemin d'accès local).;
• le second signe %s est la chaîne de requête (informations venant de l'URL). Elle est
transmise en tant que paramètre de la ligne de commande à condition de ne pas contenir
de signe égal (=).

Le serveur transmet la demande à l'application

Le serveur passe les informations à l'application CGI au moyen de variables d'environnement,


puis démarre l'application. Certaines variables sont rattachées au serveur, mais la plupart
proviennent de l'explorateur client et sont rattachées soit à celui-ci, soit à la demande qu'il est en
train d'envoyer.

L'application CGI renvoie les données au serveur

L'application effectue son traitement. Si nécessaire, elle écrit alors les données dans un format
que le client peut recevoir dans le flux de sortie standard (STDOUT). Pour renvoyer des données,
l'application doit respecter un format spécifique :

1. La ou les premières lignes contiennent des directives de serveur et doivent contenir le


type de contenu MIME. Les autres directives de serveur sont "Location", qui redirige le
client vers un autre document ou en renvoie un autre et "Status"(Etat).
2. Les directives de serveur doivent être suivies d'une ligne vide.
3. Après cette ligne vide se trouvent les données que l'application renvoie au client.

Bien qu'il soit possible de transmettre les différentes commandes HTTP de façon manuelle en
PERL, nous allons utiliser un module qui permet de masquer cette tâche. De plus, ce module
permet au script de recevoir aisément les paramètres transmis par l'explorateur client. Il contient
encore une foule d'astuce qui simplifieront considérablement la tache du programmeur :

• le module de l'Américain Lincoln D. Stein, CGI.pm fonctionne à partir de PERL5.003


est très puissant et élégant.

Nous appuierons la suite de notre exposé sur cette librairie que nous explorons au point 6 de ce
rapport. Le module CGI.pm se trouve dans les librairies CPAN de l'institut Pasteur

5
[ftp://ftp.pasteur.fr/pub/Perl/CPAN], il est encore sous Author/Stein s'il n'est pas contenu dans les
versions actuelles de PERL 5.

Ce paquetage s'installe sous /usr/local/lib/perl5 sous UNIX. Sur Windows NT ou Windows 95, il
faut installer manuellement les fichiers CGI.pm dans c:/perl/lib/ et Carp.pm dans le sous
répertoire CGI de c:/perl/lib. Bien sûr, c:/perl/lib peut avoir un nom légèrement différent en
fonction de votre installation.

Le serveur renvoie les données au client

Le serveur prend les données qu'il reçoit de STDOUT et leur ajoute les en-têtes standard HTTP.
Il transmet ensuite le message HTTP au client.

6. La librairie CGI.pm :
Nous avons introduit le module CGI.pm ci-dessus. Maintenant que nous avons étudié les
principales lignes du langage, il est judicieux d'analyser ce module qui est le pivot de l'écriture de
scripts CGI.

La documentation fournie avec la paquetage est assez bien faite, et nous nous contenterons d'en
tirer les principales lignes.

La déclaration d'utilisation peut être faite par l'une des méthodes suivantes :

• use CGI ;
• use CGI qw (:standard) ;

Dans le premier cas, l'utilisation d'une instantiation de l'objet de type CGI devra être explicite,
c'est à dire qu'après une déclaration du type :

$html=new CGI;

la variable $html devra être explicitée dans le premier cas et pas dans le deuxième. Ainsi dans
chacun des cas on écrira :

• print $html->header ;
• print header ;

L'utilisation de la valeur standard signifie que le HTML niveau 2 et les CGI seront accessibles
par l'objet CGI.

Mais d'autres valeurs peuvent être données :

cgi param(), path_info(), cookie(), request_method()...

6
form start_form() textfield() ..
les balises suivants la norme HTML 2 : p(), br(), head(), body(), start_html(),
html2
end_html()..
html3 les balises de la norme HTML 3.2
netscape les balises de Netscape
html html3, html2 et Netscape
standard tout sauf Netscape et HTML 3
all toutes les méthodes

o Les méthodes de lecture

Nous allons donner toutes les méthodes de l'objet CGI qui servent à lire des informations
envoyées par le navigateur par le tableau suivant :

Méthodes Type Définition Exemple


@noms=$html->param
Retourne un tableau contenant tous les objets
@valeur=$html-
Lorsque le paramètre est multi valué chaque
param @tableau >param('nom1')
champs est renvoyé dans un tableau, sinon
$valeur=$html-
dans une valeur.
>param('nom1')
Retourne un tableau contenant tous les objets @motscles=$html-
keywords @tableau
désignés par la balsie ISINDEX >keywords
Sauve le contenu de la requête dans le fichier
save action ouvert en écriture par le nom donné en $html->save(FICHIER)
argument.
Retourne la liste des types MIME que le
navigateur accepte si aucun argument n'est
donné.
if (html-
accept @tableau Retourne 0 si un type MIME est passé et que
>accept('text/html'))
le navigateur ne le reconnait pas .
Retourne 1 si un type MIME est passé et que
le navigateur le reconnait .

Les méthodes d'écriture

Le module CGI.pm permet la manipulation de tous les objets connus en HTML, nous supposons
que vous utilisez :

use CGI qw (:standard);

7
• Commencer un script HTML :

print start_html(-title=>'Les Secrets des Pyramides',


-author=>'pemd@pointnet.ch',
-base=>'true',
-meta=>{'keywords'=>'secret pharaons pyramides',
'copyright'=>'copyright 1996'},
-BGCOLOR=>'blue');

Ce code renverra un en-tête HTML avec l'ouverture du tag <BODY>. Tous les
paramètres sont optionnels:

• Le titre de la page : -title


• L'adress e-mail de l'auteur (créera <LINK REV="MADE"> si le paramètre -author est
inclu)
• Pour mettre des codes <BASE> dans l'en-tête, utilisez -base. Ce tag aide à résoudre les
problèmes d'adresses relatives, mais rend la hiérarchie non-portable. A utiliser avec
prudence.
• Le paramètre -xbase sert à inclure un code <BASE> qui pointe vers une destination
externe. Exemple:
• print start_html(-title=>'Les Secrets des Pyramides',
-xbase=>'http://www.pem.ch/pyramides.html');

• Le paramètre -target ouvre tous les liens dans une frame différente. Exemple:
• print start_html(-title=>'Les Secrets des Pyramides',
-target=>'reponse_frame');

-target peut être utiliser soit avec -xbase soit avec -base.

• Le paramètre -script définit les foncitons Netscape JavaScript à incorporer dans la page
HTML. C'est le meilleur moyen pour définir une librairie de fonctions JavaScript qui vont
être appelée dans la page. CGI.pm essaiera de formater le code JavaScript de manière à ce
que des browsers non-Netscape n'essaient pas d'afficher le code JavaScript.
• Le paramètre -noScript affiche un code HTML pour les browsers qui n'ont pas
JavaScript.
• Le paramètre -meta définit un ou plusieurs tags <META>. L'exemple que nous avons vu
au début de cette section, créera les tags <META> dans un format similaire à celui-ci :
• <META NAME="keywords" CONTENT="secret pharaons pyramides">
<META NAME="description" CONTENT="copyright 1996"

• Terminer un script HTML :

print end_html

8
Cette instruction termine un document HTML en plaçant les codes </BODY> et </HTML>.

• Tags HTML simples :

Les codes simples sont <P>, <HR> et <BR>. La syntaxe pour les créer est :

print p,hr,br;

Ce qui créera le texte "<p><hr><br>".

• Tags HTML doubles :

Les paires de tags incluent <B>, <I> etc. La syntaxe pour les créer est:

print b("Ceci est du texte gras!");

Ce qui donne "<b>Ceci est du texte gras!</b>".

Vous pouvez mettre autant d'arguments que vous le voulez, ils seront concaténés avec des
espaces. Ce qui vous permet de créer des tags complexes :

print u("Le",b("gras"),"est mauvais pour",i("la santé !"));

Ce qui donne : <u>Le<b> gras</b> est mauvais pour<i> la santé !</i></u>

Donc : Le gras est mauvais pour la santé !

• Autres :

use CGI ':standard';


print h1("Guide routier"),
ul(
li(a {href=>"debut.html"},"Le début"),
li(a {href=>"milieu.html"},"Le milieu"),
li(a {href=>"fin.html"},"La fin")
);
Ceci est un exemple qui montre à la fois comment faire une liste à puce et comment créer des
liens hypertextes. Si l'on connait un tant soit peu le langage HTML, cet exemple se passe
aisément de commentaires.

La plupart des codes HTML sont représentés par des appels de fonctions en lettres minuscules. Il
y a cependant quelques exceptions :

1. Le tag <tr>, utilisé pour commencer une nouvelle ligne de tableau, entre en conflit avec la
fonction Perl translate, fonction tr(). Utilisez TR() ou Tr() à la place.

9
2. Le tag <param>, utilisé pour passer les paramètres à un applet, entre en conflit avec la
fonction param() propre à la méthode CGI. Utilisez PARAM() à la place.
3. Le tag <select>, utilisé pour créer des listes de sélections, entre en conflit avec la fonction
Perl select(). Utilisez Select() à la place.

En plus des fonctions HTML de bases détaillées ci-dessus, le module permet également les
techniques suivantes :

• Les formulaires, les boîtes à cocher, les boutons, les menus déroulants, etc.
• Les codes JavaScript
• L'ordre FileUpload
• Les frames
• L'envoi et la réception de Cookies...

Exemple :
Nous allons aborder un problème un peu plus complexe et intéressant. L'exercice consiste à
pouvoir saisir des données dans un formulaire et, grâce à un script CGI, effectuer un traitement
quelconque sur ces données (ce qui est le mode de fonctionnement des moteurs de recherche).
Ceci nécessite deux étapes :
• la création d'un document HTML contenant un formulaire, ce qui permettra à l'utilisateur
de saisir des données.
• l'écriture d'un programme traitant ces données.
Pour pouvoir saisir des données dans une page HTML, nous allons utiliser la balise FORM. Cette
balise permet de réaliser un questionnaire. Les réponses saisies par l'utilisateur sont codées par le
navigateur et transmises au serveur HTTP. Utilisons l'exemple suivant (fichier form.html) :

<HTML><HEAD><TITLE>Formulaire simple</TITLE></HEAD>
<BODY>
<H2>Répondez aux questions suivantes</H2>
<FORM ACTION="http://www.april.org/cgi-bin/treat.pl" METHOD=GET>
Prénom : <INPUT TYPE="text" NAME=prenom SIZE=20><BR>
Nom : <INPUT TYPE="text" NAME=nom SIZE=20><BR>
Age : <SELECT NAME=age>
<OPTION>- de 18 ans
<OPTION>19 à 40 ans
<OPTION>41 à 60 ans
<OPTION>+ de 60 ans
</SELECT><BR>
<INPUT TYPE=submit VALUE="Envoyer"> <INPUT TYPE=reset
VALUE="Remettre à zéro">
</FORM>
</BODY>
</HTML>

10
L'utilisateur pourra ainsi entrer son prénom, nom (champ de type texte) et sélectionner l'une des
quatre valeurs possibles pour l'âge (champ de type SELECT).
Le champ d'un formulaire est identifié par l'attribut NAME. Les données sont transmises au
serveur sous la forme de paires : name=value, codées au format URL et séparées par
le symbole &.

Remarque : on a pricommme exemple URL(http://www.april.org).

Introduction aux spécifications ISAPI :


Perl ISAPI peut être téléchargé

La société Hip Inc., fabricant de logiciels indépendant, auteur de Perl pour les plates-formes
Win32, a mis au point une version de son langage qui s'exécute en tant qu'application ISAPI.
Cela signifie que les scripts de serveurs Perl sont à présent beaucoup plus rapides qu'auparavant
du fait qu'ils bénéficient du modèle intégré de ISAPI. Une version sans assistance technique de
Perl ISAPI peut être téléchargée à partir de l'adresse et du chemin spécifier. Ce site contient aussi
des informations supplémentaires.

ISAPI

ISAPI pour Windows NT peut servir à écrire des applications que les utilisateurs du Web
pourront activer en remplissant un formulaire HTML ou en cliquant sur un lien d'une page
HTML. L'application distante pourra alors traiter les informations fournies par l'utilisateur et leur
faire subir tout ce qui est programmable, puis renvoyer les résultats dans une page HTML ou les
enregistrer dans une base de données.

ISAPI peut être utilisé pour créer des applications qui exécutent en tant que DLL sur votre
serveur Web. Si vous avez déjà eu l'occasion d'utiliser des scripts CGI, vous constaterez que les
applications ISAPI sont bien plus performantes. Du fait qu'elles sont chargées en mémoire lors du
démarrage du serveur, elles consomment moins de ressources car les demandes ne déclenchent
plus chacune un processus séparé.

11
Une autre caractéristique de ISAPI est de permettre le pré-traitement des demandes et le
posttraitement des réponses, ce qui autorise une prise en charge spécifique au site des demandes
et réponses en HTTP (Hypertext Transfer Protocole). Les filtres ISAPI peuvent être utilisés pour
des applications telle la personnalisation de l'authentification, de l'accès ou de l'ouverture de
session.

En utilisant à la fois les filtres et les applications ISAPI, vous pouvez créer des sites très
complexes. Les extensions ISAPI peuvent aussi être combinées avec un connecteur de base de
données Internet afin de créer des sites hautement interactifs.

Pour toute information


concernant la programmation
avec ISAPI, consultez le
Microsoft Win32 BackOffice kit de développement SDK (Software Development Kit), disponible
sur MSDN.

Considérations de sécurité pour les programmes


exécutables :

12
Les programmes exécutables CGI doivent être utilisés avec une extrême prudence pour assurer la
sécurité du serveur. Fixez-vous comme règle de ne donner la permission Exécuter qu'à des
répertoires virtuels contenant des applications CGI ou ISAPI.

Il est fortement recommandé de configurer le mappage de scripts. Il permet en effet d'être sûr que
l'interpréteur adéquat (Cmd.exe, par exemple) démarre lorsqu'un client demande un fichier
exécutable.

Les répertoires de contenu du World Wide Web ne doivent avoir que la permission Lire. Ceci est
aussi valable pour tous les fichiers exécutables destinés au téléchargement à partir de lecteurs
NTFS (Windows NT File System).

Vous pouvez exécuter des fichiers de commandes en tant que programmes exécutables CGI, mais
faites-le avec une extrême prudence pour ne pas mettre le serveur en danger.

Permission Exécuter pour les applications ISAPI

Internet Information Server ouvre les applications ISAPI dans le contexte de sécurité de
l'utilisateur appelant. Les droits d'accès de cet utilisateur sont vérifiées. Afin de limiter l'exécution
de programmes à des utilisateurs sélectionnés, les permissions NTFS peuvent être associées aux
applications ISAPI telles que le connecteur de base de données Internet (IDC, Internet Database
Connector).

Par exemple, pour protéger l'IDC sans accorder de permissions aux fichiers .idc, vous pouvez
accorder aux utilisateurs de votre choix la permission NTFS d'exécuter Inetsrv\Httpodbc.dll.
Httpodbc.dll est le nom DLL de l'application ISAPI qui implémente l'IDC. Dès qu'un utilisateur
essaye d'exécuter l'IDC, le serveur vérifie les permissions. L'accès ne sera accordé que si cet
utilisateur bénéficie d'une permission Exécuter.

Soyez prudent lors du paramétrage des listes de contrôle d'accès (ACL) du répertoire Winnt et de
ses sous-répertoires. Certaines applications ISAPI et bases de données ont besoin d'accéder à des
fichiers et DLL enregistrés dans ces répertoires.

9. Différence entre CGI et …


Java script :
• Script inclus dans le HTML
• Exécuté par le navigateur client
CGI :

13
• Script hébergé par le serveur HTTP exécuté par le serveur
• Renvoie un document au navigateur
SSI : "Server Side Includes"
• directives inclues dans le fichier HTML "d'origine".
• exécution des directives par le serveur lorsque la page est demandée.
• le client ne voit que le résultat de la directive.
• directives limitées :
- affichage de variables d'environnement
- inclusion de fichiers
- exécution d'un script CGI !
ASP : "Active Server Page"(Microsoft)
• directives inclues dans le fichier HTML "d'origine"
• exécution des directives par le serveur lorsque la page est demandée
• le client ne voit que le résultat de la directive
• directives puissantes
-langage de programmation mélange de Javascript, Visual Basic Script…
PHP : "Personal Home Page"
• directives inclues dans le fichier HTML "d'origine"
• exécution des directives par le serveur lorsque la page est demandée
• le client ne voit que le résultat de la directive
• directives puissantes !
-langage de programmation évolué
- interaction BD
- graphique

14

Você também pode gostar