Bienvenue visiteur (Inscription |  Connexion)
Qui est en ligne ?
Il y a : 25 utilisateurs en ligne, consultez le détail
Auteur Message
TrustRobot
#0 Message posté le : 17-09-2006 à 00:00:00


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 04-07-2003
Nombre de messages : 171

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.
  • SSI: Server side include. Les SSI sont des instructions que l'on peut inclure dans une page web, qui sera analysée par le serveur avant d'etre envoyer au client.

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)
  • $ENV{'CONTENT_LENGTH'} taille des données, peut servir a déterminer la taille des données envoyées lors d'une requete http, peut determiner par exemple la taille d'un fichier uploader
  • $ENV{'CONTENT_TYPE'} type des données , peut servir également dans le cas d'un upload, si on veut s'assurer que le client uploade un fichier de tel type ex: html,jpg,etc...
  • $ENV{'HTTP_COOKIE'} renvoie le contenu des cookies du client
  • $ENV{'HTTP_REFERER'} renvoie l'url d'ou vient le client.
  • $ENV{'HTTP_REQUEST_METHOD'} renvoie le type de la méthode post ou get par exemple.
  • $ENV{'HTTP_USER_AGENT'} renvoie le nom du navigateur du client ...
  • $ENV{'QUERY_STRING'} contient les données de l'url.
  • $ENV{'REMOTE_ADDR'} contient l'adresse ip du client

Remarques :
  • vous avez sans doute remarqué que le fonction getenv en c/c++ renvoie les données sous forme: "var1=ttt&var2=hhhh" ,il faut donc analyser la chaine pour en extraire les données.En cherchant sur le web vous trouverez très facilement des classes toutes faites, pour vous aider a exploiter les CGI en c++.




--Message édité par TrustRobot le 17-09-2006 à 00:00:00--
surfsilver
#1 Message posté le : 23-06-2007 à 04:10:03


Petit scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 23-06-2007
Nombre de messages : 1
Bonsoir, bon petit article auquel je met une note quasi-maximal mais, concernant SSI, est-t-il normal qu'un code comme celui-ci (testé sur mon serveur de production et qui fonctionne) ne soit pas interprété par la machine de test ou j'ai appliqué cette article.

## DEB

<!--#if expr="\"$QUERY_STRING\" != \"i\=3\"" -->
<div class="section"><b>&#10251;</b> <a href="formations.multimedia?i=3" tabindex="36">MULTIM&Eacute;DIA</a>
<!--#else -->
<div class="section"><b>&#10255;</b> <a href="formations.multimedia?i=3" tabindex="37">MULTIM&Eacute;DIA</a>
<div class="soussection"><a href="formations.multimedia.webmester-niveau-1?i=3" tabindex="38">Webmester niveau 1</a></div>
<div class="soussection"><a href="formations.multimedia.webmester-niveau-2?i=3" tabindex="39">Webmester niveau 2</a></div>
<div class="soussection"><a href="formations.multimedia.webmester-niveau-3.1?i=3" tabindex="40">Webmester niveau 3.1</a></div>
<div class="soussection"><a href="formations.multimedia.webmester-niveau-3.2?i=3" tabindex="41">Webmester niveau 3.2</a></div>
<div class="soussection"><a href="formations.multimedia.webmester-niveau-3.3?i=3" tabindex="42">Webmester niveau 3.3</a></div>
<!--#endif -->
</div>

## END

Au lieu sortir un code HTML du type :
<div>
<div></div>
<div></div>
</div>

Il sort :
<div>
<div>
<div></div>
<div></div>
</div>
</div>


Cordialement.