Module : CGI+SSI

17 Sep. 2006
Auteur : Nico
Responsable : TrustRobot
Score ( voter ) :
Connexes : Même auteur | Même responsable | Historique

1. Introduction

Voici comment modifier la configuration de votre serveur web afin d'activer les CGI et exploiter les SSI. CGI: Common gateway interface. Une cgi est un programme dont le flux de sortie sera renvoyé au client via le serveur web.

2. Configuration d'apache

Commencons d'abord par "activer" les cgi , pour cela, il suffit de modifier le fichier httpd.conf, et trouvez la ligne
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
Le deuxième argument peut être différent, cherchez dans le fichier simplement la ligne qui contient ScriptAlias, et remplacer /var/www/cgi-bin/ par le répertoire qui contiendra les cgi, si cette ligne est manquante ajouter la simplement.
AddHandler cgi-script .pl
AddHandler cgi-script .cgi
AddHandler cgi-script .exe
Ces lignes permettent au serveur de savoir que les fichiers ayant des extensions en .pl, .cgi et .exe sont des CGI à executer. Ensuite faites un petit test, tapez ceci dans un fichier que vous nommez par exemple test.cgi
#!/bin/sh
# disable filename globbing
set -f

echo Content-type: text/html
echo
echo "<b>Les cgi ont l air de fonctionner&lt;/b>"
echo
Vous devez également systématiquement attribuer les droits nécéssaires a votre fichier pour qu'il puisse etre executé, pour cela tapez simplement:
chmod a+x /votre/site/cgi-bin/test.cgi
Ensuite testez via votre navigateur en tapant dans la barre d'adresse: http://localhost/cgi-bin/test.cgi Et vous devriez vois apparaitre un texte en gras. Maintenant nous allons "activer" les ssi dans un répertoire. Pour cela, verifier que la ligne
LoadModule includes_module libexec/mod_include.so
est bien décommentée. Ensuite ajouter (toujours dans httpd.conf) les lignes :
AddType text/html .shtml
AddHandler server-parsed .shtml
Et ensuite pour chaque répertoire qui contiendront des fichiers contenant des SSI ajoutez :
<Directory /votre/site/>
Options Indexes Includes FollowSymLinks MultiViews
</Directory>
Vous pouvez simplement rajouter cette ligne à la fin du fichier. Supposons que vous ayez activé les SSI dans le root du serveur web. Testons le bon fonctionnement des SSI en créant par exemple ce fichier:
<html>
<head><title>test SSI</title></head>
<body>
<div><!--#echo var="REMOTE_ADDR" --></div>
<div><!--#exec cgi="cgi-bin/test.cgi" --></div>
</body>
</html>
Que vous enregistrez sous test.shtml (attention a l'extension). Si vous l'avez placé a la racine du serveur Vous devriez pouvoir l'atteindre en tapant http://localhost/test.shtml dans votre navigateur.

3. Ecrire des CGI

Les cgi peuvent être écrites dans divers languages, les plus courants sont perl,python,C/C++ mais des tas d'autre language permettent d'implémenter des CGI. Le concept est toujours le même, une cgi emploie le flux de donnée standart ou l'on spécifie une entete relative au contenu généré par votre CGI. Pour du html il s'agit simplement de "Content-type: text/html". Vous devez donc effectuer une sortie de cette constante avant toutes autres sorties. Vous disposez ci-dessus d'un exemple en bash. Voici un exemple en C++ et perl:

3.1 en perl :

une CGI de base en Perl serait :
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<div>Hello world!!!</div>";
Tout simplement. Enregistrez ce code dans un fichier que vous nommez par exemple test.pl dans le repertoire cgi-bin n'oubliez pas la commande chmod a+x /votre/site/cgi-bin/test.pl Pour exploiter les variables d'environnement de apache, vous pouvez utiliser le module CGI.pm soit la variable global $ENV, modifiez test.pl de cette facon:
#!/usr/bin/perl
use CGI;
$co = new CGI;
$test = $co->param('test');
#on recupere les variables postées ou transmises par l'url
print "Content-type: text/html\n\n";
print "<div><b>test = ".$test."</b></div>";
print "<div>votre ip:".$ENV{'REMOTE_ADDR'}."</div>";
#on affiche l'adresse ip sans le module CGI
Pour comprendre au mieux ce dernier script, tapez par exemple http://localhost:80/cgi-bin/test.pl?test=foo dans votre navigateur, de sotre que perl puisse assigner une valeur a $test lors de l'instruction $test = $co->param('test');

3.2 en cpp :

Le "hello world" typique:
#include <iostream.h>
int main()
{
cout<<"Content-type: text/html\n\n"<<endl;
cout<<"<b>Hello world!!!</b>"<<endl;
return 0;
}
enregistrer ceci dans un fichier test.cpp par exemple ensuite taper la commande
g++ test.cpp -o testcpp.cgi
copier testcpp.cgi dans votre repertoire cgi-bin ( n'oubliez pas la commande chmod), et tapez dans votre navigateur http://localhost/cgi-bin/testcpp.cgi Pour exploiter les variables d'environnement, il suffit d'inclure stdlib.h pour disposer de la fonction getenv ,modifier testcpp.cpp :
#include <iostream.h>
#include <stdlib.h>
int main()
{
char * ip = getenv("REMOTE_ADDR");
cout<<"Content-type: text/html\n\n"<<endl;
cout<<"<b>Hello world!!!</b>"<<endl;
cout<<"<div>votre ip: "<<ip<<"</div>"<<endl;
return 0;
}
recompilez et recopiez testcpp.cgi au bon endroit et réexecutez le programme via votre navigateur vous devriez voir "hello world" suivi de votre adresse ip. Les variables postées peuvent également etre lu sur le flux d'entrée standart avec la fonction cin par exemple: Créer d'abord un fichier form.html que vous ne placez pas dans votre repertoire cgi-bin pour éviter tout problème de droit, par exemple a la racine : form.html :
<html>
<form action ="cgi-bin/testcpp.cgi" method="post">
<input type="text" name="test" />
<input type="submit" value="envoyer" />
</form>
</html>
et modifier test.cpp de cette facon:
#include <iostream.h>
#include <stdlib.h>
int main()
{
char * ip = getenv("REMOTE_ADDR");
int length = atoi(getenv("CONTENT_LENGTH"));
char i[10];
cout<<"Content-type: text/html\n\n"<<endl;
cout<<"<div>hello world</div>";
cout<<"<div>";
for (int j = 0;j< length;j++)
cin >> i[j];
for (int j = 0;j< length;j++)
cout<< i[j];
cout<<"</div>";
return 0;
}
Vous devriez voir "hello world" puis un retour a la ligne puis encore "test=" suivi de ce que vous avez entré dans le formulaire.

4. Variable d'environnement :

Voici une liste non-exhaustive des variables d'environnement d'apache: (que vous pouvez passer en arguments aux méthodes getenv et $ENV des codes ci-dessus) Remarques :