Sécurité PHP expliquée · défensif
Inclusion de fichiers PHP (LFI/RFI) : de quoi s’agit-il et comment corriger
include et require exécutent le fichier qu’on leur donne. Si une partie du chemin vient de la requête, c’est le visiteur qui décide de ce qui s’exécute.
Dernière mise à jour
De quoi s’agit-il
L’inclusion locale (LFI) fait pointer include ou require vers des fichiers déjà présents, comme une configuration ou des journaux ; combinée à un envoi de fichier ou à une ligne de journal, elle peut devenir une exécution de code. L’inclusion distante (RFI) charge du code depuis un autre serveur et ne fonctionne que si allow_url_include est activé, désactivé par défaut selon php.net. MITRE la classe en CWE-98.
Comment le détecter
- Cherchez
include,require,include_onceetrequire_oncedont l’argument contient une variable, et remontez cette variable jusqu’aux données de la requête. - Lancez
php -iet vérifiez queallow_url_includevaut Off et siopen_basedirest défini. - Examinez les journaux du serveur web pour des paramètres contenant
../,php://oudata:; ils montrent un sondage, pas une compromission avérée.
Comment le corriger
- Ne construisez jamais un chemin d’inclusion à partir d’une entrée. Associez une clé autorisée à un nom de fichier fixe, comme dans l’exemple ci-dessous.
- Gardez
allow_url_include = Off; envisagezallow_url_fopen = Offsi l’application n’a pas besoin de lectures distantes. - Réglez
open_basedirsur le répertoire du site pour que PHP ne puisse pas ouvrir d’autres fichiers. - Stockez les fichiers envoyés hors de la racine web et ne les incluez jamais.
Vérifications en lecture seule et modèles sûrs
# Find include/require with a variable path (read-only)
grep -rnE "(include|require)(_once)?\s*\(?\s*\$" --include=*.php . | grep -v /vendor/
php -i | grep -E "allow_url_include|allow_url_fopen|open_basedir"
; php.ini hardening
allow_url_include = Off
open_basedir = /var/www/example:/tmp
// Map user choices to fixed files instead of building paths
$pages = ['home' => 'home.php', 'about' => 'about.php'];
require __DIR__ . '/pages/' . ($pages[$_GET['p'] ?? 'home'] ?? 'home.php');basename() rend-il un include sûr ?
Il retire les répertoires mais laisse choisir n’importe quel fichier de ce répertoire. Une liste blanche explicite est plus sûre.
La RFI est-elle encore un risque en PHP moderne ?
Seulement si allow_url_include a été activé. La LFI reste courante car elle ne demande aucun réglage particulier.
Autres classes de vulnérabilités PHP
- Injection d’objets PHP : de quoi s’agit-il et comment corrigerL’injection d’objets PHP survient quand une entrée contrôlée par l’utilisateur atteint unserialize(), qui peut instancier des objets dont les méthodes magiques exécutent une logique choisie par l’attaquant.
- SSRF en PHP : de quoi s’agit-il et comment corrigerLa falsification de requête côté serveur (SSRF) survient quand une application PHP récupère une URL contrôlée par l’utilisateur, ce qui permet d’atteindre des services internes ou des points de métadonnées cloud via votre serveur.
- XSS en PHP : de quoi s’agit-il et comment s’en protégerLe cross-site scripting (XSS) survient quand une page PHP affiche dans du HTML des données contrôlées par l’utilisateur sans échappement, si bien que le script d’un attaquant s’exécute dans le navigateur d’autres visiteurs.
- Exposition de phpinfo() : pourquoi c’est important et comment corrigerUne page phpinfo() publique révèle la version exacte de PHP, les modules chargés, les chemins et souvent des variables d’environnement ou des secrets, ce qui aide les attaquants à cibler des failles comme PHP2Shell.
Sources
Les liens externes quittent ce site. Nous n’hébergeons aucun code d’exploitation.
- CWE-98: PHP Remote File Inclusion — MITRE CWE
- Testing for Local File Inclusion — OWASP Web Security Testing Guide
- Filesystem runtime configuration (allow_url_fopen, allow_url_include) — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual