Seance 09 - Apache et scripts CGI
Transcription
Seance 09 - Apache et scripts CGI
WEBMESTRE : CONCEPTION DE SITES ET ADMINISTRATION DE SERVEURS WEB Installation et administration d’un serveur web Module 25793 TP A5 (1/2 valeur) Chapitre 9 Apache et scripts CGI Le plus grand soin a été apporté à la réalisation de ce support pédagogique afin de vous fournir une information complète et fiable. Cependant, le Cnam Champagne-Ardenne n'assume de responsabilités, ni pour son utilisation, ni pour les contrefaçons de brevets ou atteintes aux droits de tierces personnes qui pourraient résulter de cette utilisation. Les exemples ou programmes présents dans cet ouvrage sont fournis pour illustrer les descriptions théoriques. Ils ne sont en aucun cas destinés à une utilisation commerciale ou professionnelle. Le Cnam ne pourra en aucun cas être tenu pour responsable des préjudices ou dommages de quelque nature que ce soit pouvant résulter de l'utilisation de ces exemples ou programmes. Tous les noms de produits ou autres marques cités dans ce support sont des marques déposées par leurs propriétaires respectifs. Ce support pédagogique a été rédigé par Michel Melcior, enseignant vacataire au Cnam Champagne-Ardenne. Copyright 2001-2003 Centre d'Enseignement A Distance du Cnam Champagne-Ardenne. Tous droits réservés. Toute reproduction, même partielle, par quelque procédé que ce soit, est interdite sans autorisation préalable du Cnam Champagne-Ardenne. Une copie par xérographie, photographie, film, support magnétique ou autre, constitue une contrefaçon passible des peines prévues par la loi, du 11 mars 1957 et du 3 juillet 1995, sur la protection des droits d'auteur. CONSERVATOIRE NATIONAL DES ARTS ET METIERS APACHE ET SCRIPTS CGI (COMMON GATEWAY INTERFACE) 1. OBJECTIFS En fin de séance, vous devriez être capable : De gérer les droits d'exécution des scripts CGI sur votre serveur. 2. INTRODUCTION. Les scripts CGI (en Français, interface de passerelle commune) servent bien souvent à traiter des données issues de formulaires placés sur des pages HTML. L'exécution du script CGI se fait côté serveur. Du point de vue d'Apache, un script CGI est un programme externe (C, C++, Bash, Perl…) qui sera appelé par le serveur. Un client, via un navigateur web, entre comme requête une url se terminant par un script cgi. Par exemple, le client invoque l'url http://www.monserveur.net/cgi-bin/compteur.cgi. Apache (avec son identité) va alors exécuter le programme compteur.cgi. Comme le ferait un utilisateur en ligne de commande. Si ce programme est écrit en Perl, une session de l'interpréteur Perl va être démarré et le programme exécuté. S'il est écrit en bash, une session bash va exécuter les commandes. S'il a été compilé (C, C++) il va être directement exécuté. Si l'on prend le cas de Perl, à chaque appel du script une session de l'interpréteur Perl doit être démarrée. Si l'on prend la rapidité comme critère de qualité de service, ce mode de fonctionnement n'est pas celui qui donnera les meilleures performances. C'est pourquoi un module interpréteur du langage Perl, intégré à Apache, existe. Nous reparlerons des modules interpréteurs à la fin de ce cours. 3. LES DIRECTIVES DE CONTROLE DES CGI. La directive ScriptAlias permet déclarer un répertoire particulier destiné à contenir les scripts cgi. Syntaxe : ScriptAlias [url-chemin] [répertoire] Contexte : configuration serveur, hôtes virtuels Module : mod_alias Exemple : ScriptAlias /cgi-bin/ /var/www/cgi-bin/ Mais cette directive ne suffit pas, il faut également donner le droit (Apache) aux scripts présents d'être exécutés dans ce répertoire. On va donc utiliser la classique directive Directory, avec l'option ExecCGI. Par exemple : <Directory /var/www/cgi-bin> AllowOverride None Options ExecCGI Order Allow,Deny Installation et administration d’un serveur web 1 CONSERVATOIRE NATIONAL DES ARTS ET METIERS Allow From All </Directory> A présent, la requête http://www.monserveur.com/cgi-bin/prog aura pour résultat l'exécution du script /var/www/cgi-bin/prog par le serveur. Bien entendu, le fichier prog doit être réellement exécutable (script shell ou Perl, programme compilé), avec les droits UNIX correctement positionnés. Les programmes CGI sont toujours une source potentielle de tracas pour l'administrateur du serveur. S'ils sont mal écrits, ils peuvent devenir des trous de sécurité. C'est pourquoi la majorité des administrateurs de sites utilisent la méthode qui vient d'être décrite pour centraliser tous les scripts dans un seul répertoire. Il est alors plus facile de surveiller ce qui est mis à la disposition des clients du serveur. Toutefois, il est possible de placer également des scripts en dehors du répertoire défini par ScriptAlias. Il faut alors utiliser la directive AddHandler. Elle permet, en fonction de l'extension du fichier, d'associer un gestionnaire spécifique appelé handler qui assurera le traitement de ce fichier. Les handlers peuvent soit être implémentés à l'intérieur du serveur sous forme de module, ou être ajoutés par la directive Action. Les handlers intégrés dans la distribution standard d'Apache sont les suivants : send-as-is : Envoie les fichiers avec leurs en-têtes HTTP tels quels. (mod_asis) cgi-script : Traite le fichier comme un script CGI. (mod_cgi) imap-file : Fichier de règles de mapping d'images. (mod_imap) server-info : Obtient les informations de configuration du serveur. (mod_info) server-parsed : Interprète les inclusions dynamiques (Server-Side Includes). (mod_include) server-status : Obtient les informations d'état du serveur. (mod_status) type-map : Active la négociation de contenu. (mod_negotiation) Directive : AddHandler Syntaxe : AddHandler [nom-handler] [extension] [extension] ... Contexte : configuration serveur, hôtes virtuels, répertoire, .htaccess Module : mod_mime Compatibilité : AddHandler est disponible à partir de la version 1.1 d'Apache Pour activer des scripts CGI écrits dans des fichiers d'extension ".cgi", vous écrirez donc: AddHandler cgi-script cgi Une fois que cette ligne a été écrite dans votre fichier de configuration d'Apache, tout fichier dont le nom termine par ".cgi" sera considéré comme un programme CGI. Il sera exécuté si : Il s'agit réellement d'un fichier exécutable dont les droits UNIX sont correctement positionnés. Le répertoire où se trouve ce script a été déclaré dans une directive Directory avec l'option ExecCGI. C'est le module mod_cgi qui sera chargé d'exécuter votre script. Entre autres choses, il met à la disposition de votre de script des variables appelées variables d'environnement. Apache et scripts CGI 2 CONSERVATOIRE NATIONAL DES ARTS ET METIERS Voici quelques-unes de ces variables, à titre d'exemple : SERVER_NAME contient le nom complet (FQDN) du serveur Apache. REQUEST_METHOD La méthode utilisée pour la requête par le client. Pour HTTP: "GET", "HEAD", "POST"… REMOTE_ADDR L'adresse IP du client. REMOTE_USER Si vous avez mis en place un mécanisme d'authentification, le nom de l'utilisateur à l'origine de la requête. HTTP_USER_AGENT Le nom du navigateur du client. Pour plus de détails, il faut consulter les documentations du module mod_cgi. Le déboguage de scripts CGI est traditionnellement laborieux, en grande partie parce qu'il est difficile d'accéder aux sorties standard (stdout et stderr) des scripts qui ne fonctionnent pas correctement. Ces directives, inclues à partir de la version 1.2 d'Apache, permettent une trace plus fine des erreurs lorsqu'elles surviennent. Lorsqu'elle est configurée, la fonction de trace d'erreurs CGI trace tout CGI qui ne s'exécute pas correctement. Chaque script CGI qui échoue provoque l'écriture d'un certain nombre de lignes dans le fichier de trace. Les deux premières lignes sont toujours sous le format : %% [temps] ligne-requête %% HTTP-status nom-fichier-script-CGI Dans le cas où le script CGI ne peut pas du tout être exécuté, la trace contiendra deux lignes supplémentaires : %% error message-d'erreur Par contre, si l'erreur résulte de l'envoi par le script de mauvaises en-têtes (souvent dues à un bug interne), les informations suivantes sont enregistrées : %request Tous les champs d'en-tête de requête HTTP reçus, entité POST ou PUT (suivant le cas). %response Tous les champs d'en-tête générés par le script CGI %stdout La sortie standard du CGI %stderr La sortie d'erreur standard du script CGI (Les parties %stdout et %stderr peuvent ne pas apparaître si le script n'a rien généré ni sur la sortie standard, ni sur la sortie d'erreur). Directive : ScriptLog Syntaxe : ScriptLog [nomFichier] Défaut : Aucun Statut : mod_cgi La directive ScriptLog définit le fichier de trace des erreurs CGI. Installation et administration d’un serveur web 3 CONSERVATOIRE NATIONAL DES ARTS ET METIERS Attention, si aucune directive ScriptLog n'est définie, les erreurs ne sont pas tracées. Par contre, si vous invoquez cette directive, toute erreur CGI est enregistrée dans le fichier défini par l'argument nomFichier. Ce fichier peut être défini par son chemin d'accès absolu, ou relativement à la racine ServerRoot. Cette trace sera ouverte au nom de l'utilisateur qui est utilisé par le processus fils Apache comme identité pour être exécuté. C'est-à-dire, l'utilisateur spécifié par la directive User principale. Ceci suppose que le répertoire dans lequel se situe cette trace ait les droits d'écriture définis pour cet utilisateur, à moins que le fichier de trace correspondant n'ait été créé manuellement et rendu inscriptible pour cet utilisateur. Si vous placez la trace de scripts dans votre répertoire principal des traces, ne changez pas les permissions sur ce répertoire pour attribuer des droits d'écriture à l'utilisateur qui est utilisé par le processus fils Apache comme identité. Notez que la trace des scripts doit rester essentiellement un outil de déboguage lors de l'écriture de scripts CGI, et n'est pas sensée être laissée active en permanence sur des serveurs en opération. Elle n'est ni optimisée en vitesse ni en efficacité, et peut provoquer des problèmes relatifs à la sécurité si elle est utilisée à un autre usage que ce pour quoi elle a été instaurée. 4. TRAVAIL PERSONNEL. Lors de la séance précédente, vous aviez déclaré /home/virtuweb comme racine des documents de votre serveur virtuel "virtuweb". Nous allons maintenant créer le répertoire /home/cgi-bin et utiliser ce répertoire pour stocker les scripts cgi du serveur. 1. Créez le répertoire /home/virtu/cgi-bin et configurez votre serveur pour que ce répertoire devienne le répertoire des scripts cgi. 2. Vous allez recopier le script Perl suivant dans ce répertoire. Appelez ce script essai1. Pensez à lui donner des droits d'exécution (chmod +x essai1). #!/usr/bin/perl –w use CGI qw(:standard); print header, start_html("essai1"), h1("hello world"); 3. Essayez votre script qui devrait être disponible à l'url : http://[votre nom de serveur]/cgi-bin/essai1. Vous devriez voir apparaître une page html avec le titre "essai1" contenant le texte "hello world" en gros caractères. Vous allez vite remarquer que le dépannage d'un script CGI peut devenir pénible... Je vous conseille, si c'est possible, d'exécuter au préalable et sans Apache vos scripts. Par exemple, placez vous dans le répertoire contenant le programme essai1. Puis entrez : ./essai1 Perl attend des paramètres en mode offline, il suffit de terminer avec la séquence CTRL+D. Si le résultat est concluant (code HTML), il a des chances de fonctionner sous Apache. 4. Vous pouvez maintenant essayer ce script que vous appellerez essai2. Apache et scripts CGI 4 CONSERVATOIRE NATIONAL DES ARTS ET METIERS #!/usr/bin/perl –w use CGI qw(:standard); my $pre=param("prenom"); if ($pre) { print header, start_html("essai2"), h1("bonjour $pre"); } else { print header, start_html("essai2"), h1("vous avez oublié d'ajouter ?prenom=.. à l'url"); }; Ce programme attend une URL du type : http://monserveur/cgi-bin/essai2?prenom=toto Où l'on passe le paramètre prenom au script (généralement par un formulaire HTML). Vous pouvez tester ce script et créer la page HTML avec le formulaire adapté. 5. LES MODULES INTERPRETEURS INTEGRES A APACHE. Le principal défaut de la méthode d'appel des scripts nécessitant un interpréteur que nous venons de voir est une certaine lenteur. Ceci est dû à la durée de chargement de l'interpréteur pour chaque appel de script. C'est pourquoi des modules interpréteurs (PHP, ASP, Perl …) ont été écrits pour Apache. Ils ne sont chargés qu'une fois et l'exécution des scripts est accélérée. L'exécution d'un script (PHP, Perl) par un module interpréteur n'est pas soumise aux mêmes conditions que l'exécution d'un script par un interpréteur externe à Apache. Pour PHP, c'est l'extension du fichier de script qui détermine l'appel du module. Par exemple, les fichiers .php et .php3 seront traités par le module php : Addtype application/x-httpd-php .php Addtype application/x-httpd-php .php3 Pour Perl, il faut définir un emplacement où les scripts Perl doivent se trouver. Par exemple : <IfModule mod_perl.c> Alias /perl/ /home/perl/ <Location /perl> SetHandler perl-script PerlHandler Apache::Registry Options +ExecCGI </Location> </IfModule> Si le module mod_perl est installé, alors les scripts Perl placés dans /home/perl seront exécutés par mod_perl. Les scripts seront accessibles à l'url : http://monserveur/perl/[nom du script]. Installation et administration d’un serveur web 5 CONSERVATOIRE NATIONAL DES ARTS ET METIERS 6. RESUME. Le tableau ci-dessous (à compléter par vos soins) résume les notions abordées dans cette séance. Directive Apache Fonction ScriptAlias ExecCGI AddHandler ScriptLog 7. ELEMENTS DE CORRECTION. NameVirtualHost 127.0.0.1 <VirtualHost 127.0.0.1> ServerAdmin webmaster@virtuweb DocumentRoot /home/virtuweb ScriptAlias /cgi-bin /home/virtu/cgi-bin ScriptLog logs/ virtu-error-cgi ServerName virtuweb ErrorLog logs/ virtu-error_log CustomLog logs/ virtu-access_log common </VirtualHost> <Directory /home/virtu/cgi-bin> Options ExecCGI Order allow,deny Allow from all </Directory> Apache et scripts CGI 6