1
0
mirror of https://github.com/php/doc-fr.git synced 2026-03-24 15:12:13 +01:00
Files
archived-doc-fr/security/cgi-bin.xml
Louis-Arnaud 2d314f78aa CI: check-style + nettoyage TRADUCTIONS.txt (#2545)
* CI: add French style checker based on TRADUCTIONS.txt

Checks changed XML files in PRs for:
- Direct address forms (vous/votre/vos) → warnings
- French grammar errors (etc..., comme par exemple, si il) → errors
- Incorrect terminology (librairie, chiffrage, encryption) → warnings

Inspired by doc-ja's textlint+prh approach but simpler:
runs directly on XML sources, no PhD render needed.

Only errors (grammar/spelling) fail the CI.
Style warnings appear as PR annotations without blocking.

* test: introduce style errors to validate CI check

* Revert "test: introduce style errors to validate CI check"

This reverts commit 7c1d523c6bbef116f54fc6dad7b61a45ee4f7ddd.

* Corriger toutes les violations de style TRADUCTIONS.txt

- 174x "Notez que" → "Il est à noter que"
- 50x "depuis PHP X" → "à partir de PHP X"
- 50x "votre" → le/la/du
- 15x "si il" → "s'il"
- 14x "Vous pouvez" → "Il est possible de"
- 14x "encryption" (faux positifs entity refs exclus)
- 12x "assurez-vous" → "il faut s'assurer"
- 12x "Vous devez" → "Il faut"
- 11x "vos" → les/des
- 9x "comme par exemple" → "par exemple"
- 6x "Vous devriez" → "Il est recommandé de"
- 2x "optionel" → "optionnel"
- 2x "reportez-vous" → "se reporter"

Toutes les règles passent désormais en erreur dans la CI.

* Harmoniser les noms de workflows GitHub Actions

- integrate.yaml → build.yml (extension + nom cohérent)
- check-style-fr.yml → check-style.yml ("-fr" redondant)
- Aligner les noms de workflow et job

* Lire les règles dynamiquement depuis TRADUCTIONS.txt

Le script parse TRADUCTIONS.txt au démarrage et génère les règles
de vérification automatiquement. Plus aucune règle en dur.

* Règles dynamiques depuis TRADUCTIONS.txt

Le script CI lit les lignes INTERDIT de TRADUCTIONS.txt pour générer
les règles de vérification. Plus aucune règle en dur dans le script.
Corrige les 27 violations restantes (Depuis PHP → À partir de PHP).

* Corriger les trailing whitespace
2026-02-25 13:13:51 +01:00

260 lines
12 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 87d3bf2e9ea7da5abbeca3e60ea7cf7abfa6f7f3 Maintainer: lacatoire Status: ready -->
<!-- Reviewed: yes Maintainer: pmartin -->
<chapter xml:id="security.cgi-bin" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Binaires CGI</title>
<sect1 xml:id="security.cgi-bin.attacks">
<title>Faiblesses connues</title>
<simpara>
Utiliser PHP comme un exécutable <acronym>CGI</acronym> est une possibilité
pour les cas où l'on ne veut pas l'utiliser comme un module
du serveur web (comme Apache), ou bien lorsque l'on souhaite l'utiliser en
combinaison avec un gestionnaire <acronym>CGI</acronym> complémentaire, afin de
créer un environnement de script sécurisé (en utilisant
des techniques de <command>chroot</command> ou <command>setuid</command>).
Une telle décision signifie habituellement que l'exécutable
<command>php</command> sera installé dans le répertoire du serveur web <filename class="directory">cgi-bin</filename>.
Le conseil de sécurité CERT <link xlink:href="&url.cert;">CA-96.11</link> recommande
de ne pas placer d'interpréteurs dans le répertoire <filename class="directory">cgi-bin</filename>.
Même si le binaire <command>php</command> peut être utilisé comme interpréteur autonome,
PHP est conçu pour prévenir les attaques que cette configuration peut rendre possibles :
</simpara>
<itemizedlist>
<listitem>
<simpara>
Accès au système de fichiers :
<filename role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>
</simpara>
<simpara>
Lorsque la requête est passée dans une url, après le point
d'interrogation (<literal>?</literal>), elle est envoyée à l'interpréteur
comme une ligne de commande par l'interface CGI. Habituellement,
l'interpréteur ouvre le fichier spécifié et l'exécute.
</simpara>
<simpara>
Lorsqu'il est invoqué comme exécutable CGI, <command>php</command> refuse
d'interpréter les arguments de la ligne de commande.
</simpara>
</listitem>
<listitem>
<simpara>
Accès à n'importe quel document web sur le serveur :
<filename role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>
</simpara>
<simpara>
Le "path information" dans l'url, situé juste après le nom
de l'exécutable PHP, <filename role="uri">/secret/doc.html</filename> est
utilisé par convention pour spécifier le nom du fichier
qui doit être ouvert et interprété par le programme
<acronym>CGI</acronym>. Habituellement, des directives de configuration
du serveur web (pour le serveur Apache : <literal>Action</literal>) sont utilisées pour
rediriger des requêtes vers des documents comme
<filename role="url">http://my.host/secret/script.php</filename> vers
l'interpréteur PHP. Dans une telle configuration, le serveur web
vérifie d'abord s'il a accès au répertoire
<filename role="uri">/secret</filename>, et redirige ensuite la requête vers
<filename role="url">http://my.host/cgi-bin/php/secret/script.php</filename>.
Malheureusement, si la requête est faite directement sous cette forme,
aucune vérification d'accès n'est faite par le serveur web
pour le fichier <filename role="uri">/secret/script.php</filename>,
mais uniquement pour le fichier <filename role="uri">/cgi-bin/php</filename>.
De cette manière, n'importe quel utilisateur qui peut accéder
au fichier <filename role="uri">/cgi-bin/php</filename> peut aussi
accéder à n'importe quel document protégé sur le serveur web.
</simpara>
<simpara>
Avec PHP, les options d'exécution
<link linkend="ini.cgi.force-redirect">cgi.force_redirect</link>,
<link linkend="ini.doc-root">doc_root</link> et
<link linkend="ini.user-dir">user_dir</link> peuvent être
utilisées pour prévenir ce genre d'attaque, si des restrictions
d'accès sont appliquées sur les documents du serveur. Voir
ci-dessous pour des explications plus complètes sur les
différentes combinaisons.
</simpara>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="security.cgi-bin.default">
<title>Cas 1 : Seuls les fichiers publics sont servis</title>
<simpara>
Si le serveur n'a aucun document dont l'accès n'est pas restreint
par un mot de passe ou un système de vérification de l'adresse
IP, ce type de configuration n'est pas nécessaire. Si le serveur web
ne permet pas les redirections, ou s'il n'a aucun besoin de
communiquer avec le binaire PHP de manière sécurisée,
il est possible d'activer la directive INI
<link linkend="ini.cgi.force-redirect">cgi.force_redirect</link>.
Il faut tout de même s'assurer que les scripts PHP ne dépendent pas d'un appel
de manière directe comme <filename role="php">http://my.host/cgi-bin/php/dir/script.php</filename>,
ou de manière indirecte, par redirection, <filename role="php">http://my.host/dir/script.php</filename>.
</simpara>
<simpara>
Avec Apache, les redirections peuvent être configurées en utilisant les directives <literal>AddHandler</literal>
et <literal>Action</literal> (voir ci-dessous).
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.force-redirect">
<title>
Cas 2 : Utilisation de la directive
<literal>cgi.force_redirect</literal>
</title>
<simpara>
La directive de configuration <link
linkend="ini.cgi.force-redirect">cgi.force_redirect</link>
évite qu'un appel direct à <command>php</command> avec une URL comme <filename
role="php">http://my.host/cgi-bin/php/secretdir/script.php</filename> ne soit possible.
À la place, PHP analysera le fichier uniquement s'il y a eu redirection.
</simpara>
<simpara>
Habituellement, la redirection est effectuée grâce aux directives suivantes dans la
configuration du serveur Apache :
</simpara>
<programlisting role="apache-conf">
<![CDATA[
Action php-script /cgi-bin/php
AddHandler php-script .php
]]>
</programlisting>
<simpara>
Cette option a uniquement été testée avec Apache, et
compte sur Apache pour affecter la variable d'environnement non-standard
<envar>REDIRECT_STATUS</envar> pour les requêtes redirigées.
Dans le cas où le serveur web ne supporte aucune manière d'indiquer si la requête a été
redirigée ou non, cette option de
compilation ne pourra pas être utilisée. Il faudra alors utiliser une des autres méthodes
d'exploitation de la version binaire CGI de PHP, comme exposé ci-dessous.
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.doc-root">
<title>Cas 3 : Utilisation du "doc_root" ou du "user_dir"</title>
<simpara>
Ajouter un contenu interactif, comme des scripts ou des exécutables, dans les répertoires
de documents du serveur web, est parfois considéré comme une
pratique non-sécurisée. Si, à cause d'une erreur de configuration, le script n'est pas
exécuté mais affiché comme une page HTML classique,
il peut en résulter une fuite de propriété intellectuelle
ou d'informations liées à la sécurité, comme, typiquement, des mots de passe.
En conséquence, un bon nombre d'administrateurs
préfèrent mettre en place un répertoire
spécial pour les scripts, qui soit uniquement accessible par le biais
du binaire CGI de PHP, ce qui signifie que tous les fichiers de ce répertoire
seront interprétés et jamais affichés tels quels.
</simpara>
<simpara>
De plus, s'il n'est pas possible d'utiliser la méthode
qui permet de s'assurer que les requêtes ne sont pas redirigées,
comme présentée ci-dessus, il est nécessaire de mettre
en place un répertoire de scripts "doc_root" différent du
répertoire "document root" du serveur web.
</simpara>
<simpara>
Pour indiquer la racine des scripts PHP, il est possible d'utiliser la directive
<link linkend="ini.doc-root">doc_root</link> dans le
<link linkend="configuration.file">fichier de configuration</link>,
ou il est possible d'affecter la variable d'environnement
<envar>PHP_DOCUMENT_ROOT</envar>. Si cette information
est renseignée, le binaire <acronym>CGI</acronym> de PHP construira
toujours le nom de fichier à ouvrir avec <parameter>doc_root</parameter>
et le "path information" de la requête, ce qui garantit
qu'aucun script ne sera exécuté en dehors du répertoire
prédéfini (à l'exception du répertoire
désigné par la directive <parameter>user_dir</parameter> -
voir ci-dessous).
</simpara>
<simpara>
Une autre option possible ici est la directive
<link linkend="ini.user-dir">user_dir</link>. Lorsque <parameter>user_dir</parameter>
n'est pas spécifiée, seuls les fichiers contenus dans le répertoire
<parameter>doc_root</parameter> peuvent être ouverts.
Ouvrir un fichier possédant l'url
<filename role="url">http://my.host/~user/doc.php</filename> ne correspondra
pas à l'ouverture d'un fichier sous le répertoire racine de
l'utilisateur, mais à l'ouverture du fichier
<filename role="uri">~user/doc.php</filename> sous le répertoire
<parameter>doc_root</parameter> (oui, un nom de répertoire commençant par un tilde
[<literal>~</literal>]).
</simpara>
<simpara>
Si la directive <parameter>user_dir</parameter> est activée, par exemple à la valeur
<filename role="dir">public_php</filename>, une requête
du type <filename role="url">http://my.host/~user/doc.php</filename>
ouvrira un fichier appelé <filename>doc.php</filename> dans le
répertoire appelé <filename role="dir">public_php</filename>
sous le répertoire racine de l'utilisateur.
Si le répertoire racine de l'utilisateur est
<filename role="dir">/home/user</filename>, le fichier exécuté
sera <filename>/home/user/public_php/doc.php</filename>.
</simpara>
<simpara>
<parameter>user_dir</parameter> et <parameter>doc_root</parameter> sont
deux directives totalement indépendantes, et il est donc possible de
contrôler l'accès au répertoire "document root"
séparément des répertoires "user directory".
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.shell">
<title>
Cas 4 : Exécutable PHP à l'extérieur de l'arborescence du serveur
</title>
<para>
Une solution extrêmement sécurisée est de
mettre l'exécutable PHP à l'extérieur de l'arborescence
du serveur web. Dans le répertoire
<filename role="dir">/usr/local/bin</filename>, par exemple.
Le seul véritable inconvénient de cette méthode est qu'il faudra
rajouter une ligne comme celle-ci :
<informalexample>
<programlisting>
<![CDATA[
#!/usr/local/bin/php
]]>
</programlisting>
</informalexample>
au début de chaque fichier contenant des balises PHP. Il faudra aussi rendre les
scripts PHP exécutables. En somme, le fichier doit être traité
exactement comme tout autre script écrit en Perl ou en
sh ou en un autre langage de script qui utilise <literal>#!</literal> comme
mécanisme pour lancer l'interpréteur lui-même.
</para>
<para>
Pour que l'exécutable PHP prenne en compte les variables
d'environnement <envar>PATH_INFO</envar> et
<envar>PATH_TRANSLATED</envar> correctement avec cette configuration,
la directive INI
<link linkend="ini.cgi.discard-path">cgi.discard_path</link>
doit être activée.
</para>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->