From: Lucien Gentis
Introduction
Configurer httpd pour autoriser CGIhttpd doit être configuré pour permettre l'exécution des - programmes CGI, pour que vos programmes CGI puissent fonctionner - correctement. Il existe plusieurs méthodes pour y parvenir.
- -LoadModule correspondante n'a pas été
- commentée dans votre httpd.conf. Une directive correcte
- doit ressembler à ceci :
-
- LoadModule cgid_module modules/mod_cgid.so- - +
La configuration de httpd doit autoriser l’exécution de CGI pour que les + programmes CGI fonctionnent. Il existe plusieurs manières d’y parvenir, qui + sont décrites ci-après.
+ +La prise en charge de CGI est assurée par deux modules :
+ mod_cgid et mod_cgi.
+ mod_cgid utilise un démon externe dédié pour gérer les
+ processus CGI et est requis lorsque httpd utilise un MPM threadé (tel que
+ event ou worker). mod_cgi
+ exécute les programmes CGI directement depuis le processus du serveur et est
+ utilisé avec les MPMs non threadés tels que prefork, ou
+ sous Windows. Du point de vue de la configuration, ils sont interchangeables
+ — les directives sont les mêmes. Voir les pages de référence de
+ mod_cgi et mod_cgid pour les détails de
+ l’implémentation.
LoadModule correspondante n'a pas été commentée
+ dans votre httpd.conf. Pour un MPM threadé :
+
+LoadModule cgid_module modules/mod_cgid.so+
LoadModule cgi_module modules/mod_cgi.so+
LoadModule cgi_module modules/mod_cgi.so+
La directive ScriptAlias se présente comme suit
:
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"- +
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"+
Cet exemple est tiré de votre fichier de configuration
httpd.conf par défaut, si vous avez installé httpd
@@ -115,12 +123,11 @@
tant que programme CGI.
Par exemple, si une requête pour l'URL
- http://www.example.com/cgi-bin/test.pl est
- effectuée, httpd tentera d'exécuter le fichier
- /usr/local/apache2/cgi-bin/test.pl et en renverra la
- sortie. Bien entendu, le fichier doit exister, être exécutable, et
- retourner sa sortie d'une manière particulière, sinon httpd
- renverra un message d'erreur.
http://www.example.com/cgi-bin/test.py est effectuée, httpd
+ tentera d'exécuter le fichier
+ /usr/local/apache2/cgi-bin/test.py et en renverra la sortie.
+ Le fichier doit exister, être exécutable, et produire une sortie sous le
+ format attendu, sinon httpd renverra un message d'erreur.
<Directory "/usr/local/apache2/htdocs/somedir"> - Options +ExecCGI +<Directory "/usr/local/apache2/htdocs/somedir"> +Options +ExecCGI </Directory>- +La directive ci-dessus indique à httpd qu'il doit permettre l'exécution des fichiers CGI. Vous devez aussi indiquer au serveur quels fichiers sont des fichiers CGI. La directive
-AddHandlersuivante indique au serveur qu'il doit traiter tous les fichiers possédant une - extensioncgiouplen tant que + extensioncgioupyen tant que programmes CGI :AddHandler cgi-script .cgi .pl- +AddHandler cgi-script .cgi .py+Fichiers .htaccess
@@ -191,21 +198,21 @@ répertoire utilisateur, vous pouvez utiliser la configuration suivante : -<Directory "/home/*/public_html"> - Options +ExecCGI - AddHandler cgi-script .cgi +<Directory "/home/*/public_html"> +Options +ExecCGI +AddHandler cgi-script .cgi </Directory>- +Pour indiquer un sous-répertoire
-cgi-bind'un répertoire utilisateur où tout fichier sera traité en tant que programme CGI, vous pouvez utiliser ceci :<Directory "/home/*/public_html/cgi-bin"> - Options ExecCGI - SetHandler cgi-script +@@ -214,8 +221,8 @@<Directory "/home/*/public_html/cgi-bin"> +Options ExecCGI +SetHandler cgi-script </Directory>- +Ecrire un programme CGI ¶
-Il y a deux différences principales entre la programmation - "standard" et la programmation CGI.
+La programmation CGI diffère de la programmation + "standard" sur deux points.
En premier lieu, toute sortie de votre programme CGI doit être précédée d'un en-tête MIME-type. Il s'agit d'un @@ -229,7 +236,7 @@
En second lieu, votre sortie doit être en HTML, ou tout autre format qu'un navigateur est en mesure d'afficher. La plupart du temps, il s'agira de HTML, mais occasionnellement, vous pouvez être - amené à écrire un programme CGI qui renvoie une image gif, ou un + amené à écrire un programme CGI qui renvoie une image GIF, ou un autre type de contenu non-HTML.
A part ces deux différences, un programme CGI ressemblera à tout @@ -241,32 +248,26 @@
L'exemple suivant est un exemple de programme CGI qui permet d'afficher une ligne de caractères dans votre navigateur. Ecrivez ce qui suit, enregistrez le dans un fichier nommé -
-premier.pl, et placez le dans votre répertoire +premier.py, et placez le dans votre répertoirecgi-bin.#!/usr/bin/perl -print "Content-type: text/html\n\n"; -print "Hello, World.";- +-#!/usr/bin/env python3 +print("Content-type: text/html\n") +print("Hello, World.")+Même si Perl ne vous est pas familier, vous devriez être - capable de comprendre le fonctionnement de ce programme. La - première ligne indique à httpd (ou à toute interface à partir de - laquelle le programme s'exécute) que ce programme peut être - exécuté en fournissant son fichier à l'interpréteur -
+/usr/bin/perl. La seconde ligne affiche la - déclaration du type de contenu considéré, suivie de deux paires - "Retour chariot - Nouvelle ligne". Ceci a pour effet d'insérer une - ligne vide après l'en-tête pour marquer la fin des en-têtes HTTP, - et le début du corps du document. La troisième ligne affiche la - chaîne de caractères "Bonjour tout le monde . . .". Et c'est tout - ce dont vous avez besoin.La première ligne indique au système d’exploitation quel interpréteur + utiliser. La première invocation de print affiche l’en-tête content-type + suivi d’une ligne vide (le
\ndans la chaîne et la nouvelle + ligne qu’ajouteprint()), qui matérialise la fin des en-têtes + HTTP. La seconde invocation de print affiche le corps. C’est là tout ce + dont un programme CGI a besoin pour produire une réponse.Si vous ouvrez votre navigateur favori et lui indiquez l'adresse
- http://www.example.com/cgi-bin/premier.pl + http://www.example.com/cgi-bin/premier.pyou toute autre URL correspondant à votre programme CGI, Vous @@ -281,9 +282,8 @@ print "Hello, World.";
Mais ça ne marche toujours pas ! ¶
-Vous devriez voir au moins une des quatre sorties suivantes dans - votre navigateur lorsque vous essayez d'accéder à votre programme - CGI depuis le web :
+Quatre sorties basiques pourront apparaître dans votre navigateur lorsque + vous essayez d'accéder à votre programme CGI depuis le web :
nobody, il suffit de lui attribuer des droits
d'exécution pour tout le monde :
-
- chmod a+x premier.pl
-
chmod a+x first.py+
En outre, si votre programme doit pouvoir accéder en lecture et/ou écriture à d'autres fichiers, ces derniers devront avoir les @@ -357,12 +356,12 @@ print "Hello, World."; CGI.
Un exemple typique de spécification de programme est le chemin
- vers l'interpréteur de script (souvent perl) que l'on
+ vers l'interpréteur de script (souvent python3) que l'on
trouve à la première ligne de votre programme CGI et qui va
ressembler à ceci :
#!/usr/bin/perl- +
#!/usr/bin/env python3+
Assurez-vous qu'il s'agit bien du chemin correct vers l'interpréteur.
@@ -407,10 +406,10 @@ print "Hello, World.";
cd /usr/local/apache2/cgi-bin
- ./premier.pl
+ ./premier.py
(N'invoquez pas l'interpréteur perl. Le shell et
+
(N'invoquez pas l'interpréteur python3. Le shell et
httpd doivent être capable de le déterminer à partir de l'information sur le chemin située sur
la première ligne du script.)
Si vous ne maîtrisez pas le fonctionnement de suexec, il vous
est déconseillé de l'utiliser. Pour désactiver suexec, supprimer
- simplement (ou renommez) l'exécutable suexec
+ (ou renommez) l'exécutable suexec
pointé par SUEXEC_BIN et redémarrez le serveur. Si
après une lecture de suexec, vous
décidez quand-même de l'utiliser, tapez la commande suexec
@@ -501,7 +500,7 @@ print "Hello, World.";
variables requises se trouve dans la RFC 3875 (Common Gateway
Interface).
Ce programme CGI basique en Perl permet d'afficher toutes les +
Ce programme CGI basique en Python permet d'afficher toutes les
variables d'environnement qui sont échangées. Deux programmes
similaires sont fournis avec la distribution de httpd et situés
dans le répertoire cgi-bin.
@@ -513,15 +512,13 @@ print "Hello, World.";
variables d'environnement aux variables de base fournies par
défaut.
#!/usr/bin/perl
-use strict;
-use warnings;
-
-print "Content-type: text/html\n\n";
-foreach my $key (keys %ENV) {
- print "$key --> $ENV{$key}<br>";
-}
+#!/usr/bin/env python3
+import os
+print("Content-type: text/html\n")
+for key, value in os.environ.items():
+print(f"{key} --> {value}<br>")
+Si vous écrivez des programmes CGI en Perl, des modules sont à
- votre disposition à CPAN. A ce
- sujet, le module le plus populaire est CGI.pm. Vous
- pouvez aussi essayer CGI::Lite, qui implémente les
- fonctionnalités strictement nécessaires, mais suffisantes pour
- la majorité des programmes.
Si vous écrivez des programmes CGI en C, vous disposez de nombreuses
- options. L'une d'elles est la bibliothèque CGIC de https://web.mit.edu/wwwdev/www/cgic.html.
Si vous écrivez des programmes CGI en Python, le module cgi
+ de la bibliothèque standard (obsolète dans Python 3.11, supprimé dans Python
+ 3.13) prenait en charge l’analyse de formulaire. Avec les versions actuelles
+ de Python, utilisez le module urllib.parse pour analyser les
+ chaîne de paramètres et les données de formulaire. Pour des applications
+ plus complexes, orientez-vous vers un cadriciel WSGI léger, bien que cela
+ aille au-delà du domaine de la CGI traditionnelle.
Notez que les questions à propos de problèmes CGI ne doivent +
Langues Disponibles: en |
diff --git a/docs/manual/howto/cgi.xml.meta b/docs/manual/howto/cgi.xml.meta
index b7cd1c9800..c7cff59430 100644
--- a/docs/manual/howto/cgi.xml.meta
+++ b/docs/manual/howto/cgi.xml.meta
@@ -9,7 +9,7 @@
Ce document couvre l'installation et la compilation du serveur - HTTP Apache - sur les systèmes Unix et similaires seulement. Pour la compilation et - l'installation sous Windows, voir Utiliser le serveur HTTP Apache avec Microsoft - Windows et Compilation - d'Apache sous Microsoft Windows. Pour les autres plateformes, se - référer à la documentation par - plateforme.
+Le serveur HTTP Apache est distribué sous forme de code source. Ce + document décrit la construction et l’installation du serveur à partir des + sources sous Unix et les systèmes de la famille d’Unix. Pour Windows, voir + Utiliser le serveur HTTP Apache avec + Microsoft Windows et Compilation + de httpd sous Microsoft Windows. Pour les autres plateformes, se + référer à la documentation par plateforme.
-Apache httpd utilise libtool et autoconf
- afin de créer un environnement de construction similaire à la plupart
- des projets Open Source .
Si vous installez httpd depuis un paquet de distribution (RPM, DEB, + etc.), l’organisation de la configuration et les valeurs par défaut peuvent + être différentes de ce qui est décrit ici. Voir paquets + tiers ci-après et consultez la documentation de votre distribution pour + les détails spécifiques à la plateforme.
Si vous effectuez une mise à jour depuis une version mineure vers la suivante (par exemple, 2.4.66 à 2.4.67), veuillez passer à la section @@ -66,52 +65,11 @@
Mise à jour
Paquets tierssudo dnf install httpd - -# Démarrage du service -sudo systemctl start httpd - -# Arrêt du service -sudo systemctl stop httpd - -# Redémarrage du service -sudo systemctl restart httpd- - -
sudo apt install apache2 - -# Démarrage du service -sudo systemctl start apache2 - -# Arrêt du service -sudo systemctl stop apache2 - -# Redémarrage du service -sudo systemctl restart apache2- - -
| Modules Apparentés | Directives Apparentées |
|---|---|
| Modules Apparentés | Directives Apparentées |
|---|---|
La directive LogMessage
+ vous permet de créer vos propres messages de journalisation
+ personnalisés pour faciliter vos opérations de débogage.
+
Ce document est un complément à la documentation de référence du module
mod_rewrite. Il décrit les concepts de base dont la
@@ -44,9 +42,10 @@ pieds.
Conditions de réécriture
Tables de réécriture
Fichiers .htaccess
Considérations en matière de sécuritémod_rewrite est à ce prix car vous verrez alors
exactement comment chaque règle est traitée.
+
+ 
+ Figure : Présentation simplifiée de la manière dont
+mod_rewrite traite une requête. Voir Détails techniques pour une description complète du
+traitement avec les phases, les drapeaux et le bouclage.
+
mod_rewrite utilise le vocabulaire des Expressions rationnelles compatibles Perl. +
mod_rewrite utilise le vocabulaire des Expressions
+rationnelles compatibles avec Perl à l’aide de la bibliothèque PCRE2.
Ce document n'a pas pour prétention d'être une référence détaillée des
-expressions rationnelles. A cet effet, nous recommandons les pages de manuel de PCRE, la page de manuel des
-expressions rationnelles Perl, et l'ouvrage Mastering
+expressions rationnelles. A cet effet, nous recommandons la documentation de
+PCRE2, la page de manuel des
+expressions rationnelles de Perl, et l'ouvrage Mastering
Regular Expressions, par Jeffrey Friedl (la troisième édition date
de 2006, mais la syntaxe des expressions rationnelles n'a pas vraiment
changé, et cet ouvrage reste la référence en la matière).
c/tAvec mod_rewrite, le caractère ! peut
+
Le caractère ! (Not) peut
préfixer une expression rationnelle afin d'en exprimer la négation.
Autrement dit, une chaîne ne correspondra que si elle ne correspond pas
à l'expression située après le !.
Notez que lorsqu’on utilise ! pour inverser un motif, les références arrières (par exemple $1,
+$2) ne sont pas disponibles, car le motif ne correspond plus.
La règle suivante, par exemple, redirige toute requête qui ne commence
+pas par /admin
RewriteRule "!^/admin" "/xyz.html" [R,L]+ +
Vous devez vous souvenir d'une chose importante : chaque fois
- que vous utilisez des parenthèses dans un Modèle ou dans
+ que vous utilisez des parenthèses dans un Motif ou dans
un des modèles de conditions, des références arrières
sont créées en interne et peuvent être rappelées via les chaînes
$N et %N (voir ci-dessous). Ces
@@ -184,13 +201,18 @@ arrières dans les expressions rationnelles
elles vous paraissent un peu exotiques au premier abord.
- 
+ 
Figure 1 : Le cheminement d'une référence arrière à
travers une règle.
- Dans cet exemple, une requête pour /test/1234 serait
+ Dans cet exemple, une requête pour /test/1234 vers l’hôte admin.example.com serait
transformée en
- /admin.foo?page=test&id=1234&host=admin.example.com.
+ /admin.foo?page=test&id=1234&host=admin.example.com,
+ sous réserve que %{DOCUMENT_ROOT}/test ne soit pas un fichier
+ existant.
Voir aussi Détails techniques + pour un diagramme montrant le cheminement des références arrières avec des + conditions multiples.
Une règle de réécriture RewriteRule est constituée de trois
arguments séparés par des espaces. Les arguments sont :
Le Modèle est une expression -rationnelle. Au sein de la première règle de réécriture, ou jusqu'à -ce qu'une substitution survienne, elle est comparée au chemin de -l'URL de la requête entrante (la -partie située après le nom d'hôte mais avant tout point d'interrogation -qui indique le début d'une chaîne de paramètres de -requête) ou, dans un contexte de répertoire, au chemin de la -requête relativement au répertoire pour lequel la -règle est définie. Lorsqu'une substitution a eu lieu, les -règles suivantes effectuent leurs comparaisons par rapport à la valeur -substituée.
+Le Motif est une expression
+rationnelle. Dans un contexte de serveur virtuel ou de serveur global, il
+est comparé au chemin d’URL %-décodé
+de la requête entrante — la partie après le nom d’hôte et le port, en
+excluant la chaîne de paramètres (par exemple /app/index.html).
+Dans un contexte de répertoire, le motif
+est comparé au chemin de la requête relatif au répertoire pour lequel la règle
+est définie (avec le préfixe de répertoire supprimé — voir Réécritures par répertoire pour les
+détails).
+
Lorsqu’une substitution a été effectuée, toute règle qui suit est comparée à +la valeur substituée.
+ +Le Motif n’est comparé qu’au chemin d’URL — à l’exclusion
+des nom d’hôte, port ou chaîne de paramètres. Pour une comparaison incluant ces
+derniers, utilisez une condition RewriteCond avec les variables
+%{HTTP_HOST}, %{SERVER_PORT} ou
+%{QUERY_STRING}, respectivement.
mod_rewrite opère exclusivement sur le chemin d’URL et les
+en-têtes HTTP. Il ne peut pas inspecter le corps de la requête (par exemple, les
+données POST). Si vous devez prendre des décisions de routage en fonction du
+contenu du corps de la requête, traitez le problème à l’aide de la logique de
+votre application ou utilisez un module tel que mod_request
+associé à un filtre personnalisé.
- 
+ 
Figure 2 : Syntaxe de la directive RewriteRule.
La chaîne de Substitution peut aussi contenir des références arrières vers des parties du chemin d'URL entrant -correspondant au Modèle. Considérons ce qui suit :
+correspondant au Motif. Considérons ce qui suit :RewriteRule "^/produits/(.*)/view$" "/var/web/produitsdb/$1"
La variable $1 sera remplacée par tout texte
correspondant à l'expression située entre les parenthèses dans le
-Modèle. Par exemple, une requête pour
+Motif. Par exemple, une requête pour
http://example.com/produits/r14df/vue correspondra au
chemin /var/web/produitsdb/r14df.
- 
+ 
Figure 3 : Syntaxe de la directive RewriteCond
La réécriture est en général définie au niveau de la configuration du
-serveur principal (en dehors de toute section <Directory>) ou dans une section <VirtualHost>. Il s'agit là de la
-manière la plus simple de mettre en oeuvre la réécriture et nous la
-recommandons. Il est possible, cependant, de mettre en oeuvre la
-réécriture au sein d'une section <Directory> ou d'un fichier .htaccess ; ce type de
-configuration est cependant plus complexe. Cette technique est appelée
-réécriture par répertoire.
La principale différence avec les réécritures au niveau du serveur réside
-dans le fait que le préfixe du chemin du répertoire contenant le fichier
-.htaccess est supprimé avant la mise en correspondance dans
-la règle RewriteRule. De
-plus, on doit utiliser la directive RewriteBase pour s'assurer que la
-requête est correctement mise en correspondance.
Il est possible d’utiliser des règles de réécriture dans un contexte de répertoire (fichiers .htaccess et sections <Directory>), mais dans ce cas, les
+règles se comportent différemment — en particulier, le préfixe du répertoire est
+supprimé de l’URL avant la recherche de correspondance. Voir le document Réécritures dans un contexte de
+répertoire pour une explication détaillée. Notez que les sections <If> et <Location> adoptent aussi le comportement du contexte
+de répertoire — voir Quels
+contextes prennent en charge les règles de réécriture ?.
mod_rewrite est un outil de manipulation d’URL puissant,
+mais qui dit puissance dit risque d’erreurs liées à la sécurité. Cette section
+met en lumière les pièges en matière de sécurité courants à éviter lors de
+la rédaction de règles de réécritures.
Si une règle RewriteRule
+construit un URL de redirection en utilisant une entrée utilisateur non validée,
+un attaquant pourra fabriquer un lien qui redirige les visiteurs vers un site
+malveillant semblant provenir de votre domaine. Cette vulnérabilité est connue
+sous le nom de redirection ouverte.
Par exemple, cette règle est dangereuse :
+ +# DANGEREUX - permet une redirection ouverte
+RewriteRule "^/redirect" "%{QUERY_STRING}" [R,L]
+
+
+Un attaquant pourrait en effet utiliser
+https://yoursite.com/redirect?https://evil.com pour rediriger les
+utilisateurs vers un site malveillant. Assurez vous de toujours valider ou
+contraindre les cibles de redirection. Si la destination doit être sur votre
+propre site, assurez vous que la substitution commence par / (un
+chemin relatif) plutôt que de permettre à l’utilisateur d’entrer un URL complet.
Lorsqu’on utilise la drapeau [P] (proxy),
+mod_rewrite fait que le serveur
+effectue une requête HTTP vers l’URL de substitution de la part du client. Si
+une partie de cet URL est dérivée de l’entrée du client — références arrières,
+chaînes de paramètres ou en-têtes — un attaquant pourrait faire que votre
+serveur effectue des requêtes vers des services internes arbitraires ou des
+hôtes externes.
Par exemple :
+ +# DANGEREUX - l’utilisateur contrôle la cible du mandataire
+RewriteCond "%{QUERY_STRING}" "target=(.+)"
+RewriteRule "^/fetch" "http://%1" [P]
+
+
+Un attaquant pourrait utiliser cette configuration pour tester des services +réseau internes qui autrement ne seraient pas accessibles depuis l’Internet. +Utilisez toujours un nom d’hôte fixe dans les cibles de mandataire et limitez +les références arrières à la partie chemin seulement.
+ + + +Des règles de réécriture qui associent directement des composants du chemin +fournis par l’utilisateur au système de fichier ouvrent la voie à des attaques +de traversée de chemin si l’entrée n’est pas correctement contrainte. Par +exemple :
+ +# DANGEREUX - permet une traversée de chemin +RewriteRule "^/files/(.+)" "/var/data/$1" [L]+ + +
Une requête pour /files/../../etc/passwd pourrait accéder à des
+fichiers en dehors du répertoire souhaité. Utilisez des motifs restreints dans
+votre règle RewriteRule (par exemple
+[a-zA-Z0-9_-]+ au lieu de .+), et utilisez les
+protections intégrées d’Apache httpd (restrictions Options et <Directory>) pour une défense en profondeur.