Les scripts CGI

Transcription

Les scripts CGI
Licence professionnelle
« Management des organisations »
Option « Systèmes d’information et Réseaux »
Internet et applications dans l’entreprise (1)
Scripts clients et scripts CGI
O. Auzende
2010-2011
INTRODUCTION ................................................................................................................................................... 3
PARTIE CLIENT : SCRIPTS CLIENTS ET APPLETS JAVA............................................................................................... 3
PARTIE SERVEURS : SCRIPTS SERVEURS .................................................................................................................. 3
LES SCRIPTS CGI ................................................................................................................................................. 4
1. INTRODUCTION ................................................................................................................................................... 4
2. TESTER DES SCRIPTS CGI.................................................................................................................................... 4
3. PERL ET LE MODULE CGI.PM ............................................................................................................................. 5
4. EXERCICE : REPONSE A UN FORMULAIRE............................................................................................................. 6
5. PERL ET LES BASES DE DONNEES TEXTE............................................................................................................. 6
6. RECOPIE D’UN FICHIER........................................................................................................................................ 7
7. EXERCICE : ARTICLES D’ACTUALITE A LA DEMANDE ........................................................................................... 8
2
Internet et applications dans l’entreprise
O. Auzende
Introduction
Le principal apport d’Internet dans les entreprises est de favoriser les contacts directs entre l’entreprise et ses
salariés, l’entreprise et ses fournisseurs, l’entreprise et ses clients.
Le commerce électronique croît de façon exponentielle dans le monde ; il dépend totalement de ce que l’on appelle
les technologies serveurs permettant de faire des transactions en ligne et des techniques de cryptologie qui
permettent de les sécuriser.
Dans ce cours, nous ferons d’abord la distinction entre scripts clients et scripts serveurs, en montrant les limites
des premiers, puis nous étudierons les principakes technologies serveurs actuelles et les connexions des scripts
serveurs aux bases de données relationnelles permettant de mémoriser les informations échangées.
Partie client : scripts clients et applets java
Un site Web peut être dynamisé sur le poste client soit par des « scripts clients » (scripts en javascript exécutés sur
le poste client) soit par des applets java. Une page html qui contient uniquement, outre le HTML, des scripts
clients ou des applets java est cependant appelée une page Web statique car son code ne change pas constamment.
Scripts clients javascript
Un script client javascript est normalement destiné à réaliser des animations ou à contrôler la validité d’un
formulaire avant son envoi au serveur. Exemples :
o animation : zone.html
o récupération de valeur dans une liste de choix : traducteur1.html
o récupération de texte dans une zone de texte : traducteur2.html
o contrôle de formulaire : controles.html
Avant l’arrivée de la technologie Ajax, un script client javascript ne pouvait en aucun cas communiquer avec le
serveur dont provient la page dans laquelle il est inséré. Depuis Ajax et JQuery, cette possibilité est envisageable,
sous réserve que l’interpréteur javascript ne soit pas désactivé dans le navigateur client (voir dernière partie du
cours).
Applets java
Une applet java dispose d’une zone de la page html dans laquelle elle est insérée et gère cette zone elle-même. Elle
peut communiquer avec le serveur dont elle est issue pour lire un fichier, mais pas pour réaliser une interrogation
de base de données. Exemples :
o dessin dans la zone réservée à l’applet : applet Geometrique dans la page geometrique.html
o conversion en euro : applet Convert dans la page convert.html
o chargement d’images à partir du serveur : applet ChargeImages dans la page ChargeImages.html
o lecture d’un fichier du serveur à partir de l’applet : applet Texte dans la page Texte.html
Partie serveurs : scripts serveurs
Lors d’une connexion à Internet, lorsqu’un utilisateur (client) demande au serveur auquel il est connecté
d’effectuer un traitement (généralement interrogation d’une base de données en réponse à une demande effectuée
avec un formulaire), un programme s’exécute en temps réel sur le serveur et renvoie le résultat (généralement une
page HTML) au navigateur client. Ce programme est appelé script serveur, car il est exécuté sur le serveur et pas
sur le poste client. La page renvoyée est appelée une page dynamique, car elle a été générée à la demande.
Plusieurs technologies permettent de générer des pages dynamiquement. La technologie choisie dépend du
système d’exploitation de la machine utilisée comme serveur (Windows, Unix, Linux…) et du logiciel serveur luimême (Apache, MIIS, Netscape server …).
Ce cours a pour but de présenter les technologies existant actuellement et d’étudier leur interfaçage avec des bases
de données :
o CGI (sur serveur Apache sous Linux)
o ASP (sur serveur MIIS sous Windows)
o JSP (sur serveur Tomcat sous Windows ou Linux)
o PHP (sur serveur Apache sous Linux ou Windows)
3
Les scripts CGI
1. Introduction
La programmation CGI (Common Gateway Interface) permet de construire dynamiquement des documents par un
serveur HTTP. Elle est associée au serveur Apache sous Unix et Linux.
Les programmes CGI (appelés généralement scripts CGI) sont des scripts serveurs placés dans un répertoire
spécifique de l'arborescence du serveur, nommé /cgi-bin, contrôlé par l'administrateur du serveur qui vérifie leur
sécurité avant de les rendre accessibles au public.
Un script CGI peut être écrit dans de nombreux langages. On utilise :
o sous UNIX, les langages PERL, C, C++, Fortran, Pascal, TCL, sh, csh, ksh ou n'importe quel autre shell ;
nous utiliserons ici le langage PERL.
o sous Windows, le C, le C++, le Visual Basic
o sur MAC-OS, essentiellement AppleScript.
Dans tous les cas, il faut vérifier que les fichiers possèdent bien les droits d'exécution.
Un script CGI peut renvoyer une image, un document HTML, un clip audio, des références vers d’autres
documents, etc.
Comme le navigateur client doit savoir quel type de document lui est renvoyé afin de pouvoir le traiter
correctement, le résultat de l’exécution d’un script CGI doit comporter un en-tête (header) qui précise la nature
du document renvoyé.
Exemple lorsqu’un script CGI génère une page HTML :
l’en-tête
ligne blanche de séparation obligatoire
corps
Content-type: text/html
<html>
...
</html>
2. Tester des scripts CGI
Exemple de page html permettant de tester si les scripts CGI fonctionnent. Cette page test.html appelle le script
CGI appelé test.cgi et écrit en langage Perl :
Page test.html
<html>
<head>
<title>Page de test</title>
</head>
<body>
<p>Ceci est une page de test dont le but est de v&eacute;rifier que les scripts
CGI fonctionnent avec Apache.</p>
<p>Elle contient donc un formulaire r&eacute;duit &agrave; un bouton Valider ;
lorsqu'on clique sur le bouton, le script test.cgi doit s'ex&eacute;cuter.</p>
<form action="cgi-bin/test.cgi" method="get">
<input type="submit" value="Valider">
</form>
</body>
</html>
Fichier test.cgi
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print "<html><head><title>R&eacute;ponse</title></head>";
print "<body><p>Le script CGI est bien appel&eacute; en r&eacute;ponse &agrave; la page
test.html</p></body></html>";
4
Internet et applications dans l’entreprise
O. Auzende
On teste des scripts CGI :
1) en mode ligne de commande :
perl –cw nomscript.cgi
perl nomscript.cgi
permet de vérifier la syntaxe d’un script
permet de le faire exécuter avec résultat à l’écran
2) avec un serveur Apache, utilisable en hôte local. Dans ce cas :
- les fichiers HTML doivent se trouver dans un répertoire spécifique, ici /var/www/htdocs
- les scripts CGI doivent se trouver dans un autre répertoire spécifique, ici /var/www/cgi-bin
- l’interpréteur PERL se trouve dans le répertoire /usr/bin/perl.
L’adresse fournie au navigateur pour l’affichage d’une page HTML est http://localhost/page.html
Si cette page HTML contient un formulaire, l’appel au script CGI devant traiter ce formulaire se fait dans la page
HTML par <form action="/cgi-bin/nomscript.cgi" >
La disquette contient un répertoire htdocs et un répertoire cgi-bin. On doit recopier le contenu du répertoire htdocs
dans /var/www/htdocs et le contenu du répertoire cgi-bin dans /var/www/cgi-bin.
Pour recopier :
o Poste de travail  double-clic sur floppy drive  icône sur le bureau. Double-clic sur l’icône pour faire
apparaître de contenu de la dk.
o Applications  Outils système  Navigateur de fichiers : remonter jusqu’à var, puis descendre dans www
(on ira d’abord dans htdocs, puis dans cgi-bin)
o Faire glisser les fichiers des deux répertoires de la dk vers les répertoires correspondant de /var/www
o Ensuite faire un clic droit sur l’icône de la disquette pour démonter le floppy.
Dans le dossier /var/www/cgi-bin, voir les droits des différents fichiers : ls –ail
S’ils ne les ont pas déjà, donner ensuite aux scripts cgi les droits d’exécution (taper chmod +x *.cgi).
Lancer un navigateur par Applications  Internet  Firefox. Faire exécuter la page test.html par l’URL
http://localhost/test.html et vérifier qu’elle demande bien l’exécution du script test.CGI.
3. PERL et le module CGI.pm
Le module CGI.pm, généralement installé avec Apache, automatise le décodage des données provenant d’un
formulaire.
La page voter.html suivante contient un formulaire demandant l’âge du client ; l’action associée au bouton submit
est l’appel du script voter.cgi. Tester cette page par http://localhost/voter.html
Page voter.html
<html>
<head>
<title>Pouvez-vous voter ?</title>
</head>
<body>
<h2><center>Avez-vous l'&acirc;ge de voter ?</center></h2>
<h3><center>Premier exemple de passage d'un param&egrave;tre d'une page HTML
&agrave; un script CGI</center></h3>
<center>
<form method="get" action="cgi-bin/voter.cgi">
<p>Quel est votre &acirc;ge ? </p>
<p>Champ de saisie du param&egrave;tre (tester successivement une valeur
inf&eacute;rieure &agrave; 15, une valeur sup&eacute;rieure &agrave; 15
mais inf&eacute;rieure &agrave; 18 puis une valeur sup&eacute;rieure
&agrave; 18):</p>
<p><input type="text" name="age" size=3><br></p>
<p>Envoi du formulaire : </p>
<p><input type="submit" value="OK"></p>
</form>
</center>
</body>
</html>
5
Script voter.cgi
(emplacement de l'interpréteur perl)
(module CGI.pm associé à l'interpréteur)
(objet créé par le module)
(récupération de la valeur de la variable age)
#!/usr/bin/perl
use CGI;
$query=new CGI;
$entree=$query->param('age');
if ($entree>=18) {
$voter='oui';
}
else {
$voter='non';
}
print $query->header;
print "<html><head><title>Pouvez-vous voter ?</title></head>\n";
print "<body><center><H2>Avez-vous l'&acirc;ge de voter ?</H2>\n";
print "Vous avez dit que vous avez ",$entree," ans.";
if ($voter eq 'oui') {
print "<P>Vous &ecirc;tes majeur, donc vous pouvez voter.</P>\n";
}
elsif ($entree < 15) {
print "<P>Vous &ecirc;tes bien trop jeune pour voter...</P>\n";
}
else {
print "<p>Vous &ecirc;tes encore trop jeune pour voter...</p>\n";
}
print "</center></body></html>\n";
4. Exercice : réponse à un formulaire
1) Visualisez avec le navigateur le fichier formulaire.html qui se trouve dans le
répertoire /var/www/htdocs.
On veut écrire en PERL le script CGI chargé, sur le serveur, de répondre à ce
formulaire. Exemple à droite de formulaire rempli.
2) Ouvrez avec emacs le fichier formulaire.html et notez les renseignements dont
vous aurez besoin dans le script CGI. Il ne faut pas modifier le fichier
formulaire.html.
3) Dans le répertoire /var/www/cgi-bin écrivez
en PERL le script CGI qui génère, en réponse au
formulaire, la page HTML présentée ci-contre à
gauche.
La page doit être adaptée aux renseignements fournis par le client (sexe,
prénom, nom, choix cinéma / théâtre, support).
4) Testez la syntaxe de ce script CGI.
Lorsqu’elle est correcte, donnez au script les droits d’exécution.
Faites ensuite exécuter formulaire.html par Apache et vérifiez que le script
CGI répond correctement à la demande de l’utilisateur.
5. PERL et les bases de données texte
Le fichier base.txt suivant comporte une base de données texte qui est une sorte de carnet d'adresses (le séparateur
sur chaque ligne est en fait une tabulation) :
Fichier base.txt
dupont [email protected] explorer
francois
[email protected]
explorer
philippe
[email protected]
opera
anne
[email protected]
explorer
anne
[email protected]
opera
6
Internet et applications dans l’entreprise
O. Auzende
La page lecture.html demande un nom pour interroger la base de données, et le script CGI répond à la demande :
Page lecture.html
<html>
<head>
<title>Interrogation de la base</title>
</head>
<body>
<h1>Recherche d'enregistrements</h1><br>
<form method="get" action="/cgi-bin/lecture.cgi">
Nom : <input type="text" name="nom"><br>
<input type="submit" value="OK">
</form>
</body>
</html>
Script lecture.cgi
#!/usr/bin/perl
use CGI;
$query = new CGI;
$fichier="base.txt";
print $query->header;
print "<html>\n<head>\n<title>Interrogation de la base</title>\n";
print "</head>\n<body>\n";
print "<h1>Recherche d'enregistrements</h1>\n<br>";
if ($query->param()) {
$search_name = $query->param('nom');
eval {
open (GUESTS, "< $fichier") or
die "Impossible d'ouvrir $fichier : $!";
while (<GUESTS>) {
($name, $email, $browser)=split /\t/;
if ($name =~ /$search_name/i) {
print "$name<br>\n$email<br>\n$browser<br>\n<hr>\n";
}
}
}
}
print "</body>\n</html>\n";
}
6. Recopie d’un fichier
Appeler directement un script autonome (c’est-à-dire sans page HTML associée) est possible.
Cela se fait par l’appel à l’URL : http://localhost/cgi-bin/nom-du-script.cgi
Exemple de script CGI renvoyant une copie d’un fichier mis sur le serveur (le fichier appelé fichier.txt qui doit lui
aussi se trouver dans le répertoire cgi-bin) :
Script recopier.cgi
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print "<html><head><title>Recopie d'un fichier</title></head>";
print "<body><p>Ce script CGI est appel&eacute; directement</p>";
print "<p>Il recopie ligne &agrave; ligne le fichier appel&eacute; fichier.txt pour obtenir le
r&eacute;sultat suivant : </p><hr>";
$file="fichier.txt";
open(INPUT,"< $file")
or die "impossible d'ouviri le fichier";
while (<INPUT>) {
tant qu’il reste des lignes dans
on recopie la ligne courante
print;
print "<br>";
}
et on passe à la suivante
close INPUT;
print "<hr></body></html>";
Ce script est à appeler directement par l’URL http://localhost/cgi-bin/recopier.cgi
7
le buffer INPUT
7. Exercice : articles d’actualité à la demande
La page actualites.html (voir ci-contre) propose à
l’utilisateur des articles d’actualité ; l’utilisateur choisit le
sujet auquel il s’intéresse plus particulièrement : économie,
politique, sciences, etc.
Mettre cette page dans le répertoire /var/www/htdocs et la
visualiser par http://localhost/actualites.html
Le fichier listeArticles.txt associe à chaque nom de fichier
d'article son sujet, plusieurs articles pouvant bien entendu
correspondre au même sujet :
economie
eco1.txt
economie
eco2.txt
politique
politique1.txt
politique
politique2.txt
politique
politique3.txt
sciences
sciences1.txt
sciences
sciences2.txt
sciences
sciences3.txt
(On a utilisé une marque de tabulation pour séparer le sujet de l'article du nom du fichier correspondant).
Lorsque l'utilisateur clique sur le bouton de soumission de la page HTML, on souhaite qu’un script CGI recherche
les fichiers des articles correspondant au sujet demandé et renvoie une page HTML contenant les différents
articles, séparés par des traits :
On vous donne les fichiers listeArticles.txt, eco1.txt, eco2.txt, politique1.txt, politique2.txt, politique3.txt,
sciences1.txt, sciences2.txt et sciences3.txt, qui sont tous à mettre dans le répertoire cgi-bin.
Regarder avec emacs le code de la page actualites.html.et noter les renseignements nécessaires, puis écrivez le
script CGI répondant à la requête de l'utilisateur.
8