Après avoir maîtrisé l’exploitation des failles LFI et RFI, cette unité finale présente toutes les mesures de prévention. La défense en profondeur est le principe clé.
Règle n°1 : Ne jamais inclure des fichiers via une entrée utilisateur directe
La meilleure protection est d’utiliser une liste blanche (whitelist) des pages autorisées :
<?php
// Mauvais
include($_GET['page'] . '.php');
// Bon : whitelist explicite
$pages = ['accueil', 'contact', 'apropos'];
$page = $_GET['page'] ?? 'accueil';
if (!in_array($page, $pages, true)) { $page = 'accueil'; }
include('pages/' . $page . '.php');
?>
Règle n°2 : Désactiver allow_url_include
# Dans php.ini
allow_url_include = Off
allow_url_fopen = Off
# Vérifier
php -i | grep allow_url
Règle n°3 : Utiliser open_basedir
Restreint les fichiers accessibles par PHP à un répertoire spécifique :
# Dans php.ini
open_basedir = /var/www/html/:/tmp/
# Par virtual host Apache
<VirtualHost *:80>
php_admin_value open_basedir /var/www/html/
</VirtualHost>
# Avec open_basedir, inclure /etc/passwd retourne :
# Warning: open_basedir restriction in effect. File /etc/passwd is not within the allowed path(s)
Règle n°4 : Valider les chemins avec realpath()
<?php
function include_safe(string $page, string $base): void {
$real = realpath($base . $page . '.php');
$base = realpath($base);
if ($real === false || strpos($real, $base) !== 0) {
http_response_code(403);
die('Accès refusé');
}
include($real);
}
include_safe($_GET['page'] ?? 'accueil', '/var/www/html/pages/');
?>
Règle n°5 : Sécuriser les logs serveur
# Les logs Apache ne doivent pas être lisibles par www-data
chown root:adm /var/log/apache2/access.log
chmod 640 /var/log/apache2/access.log
Règle n°6 : WAF ModSecurity
sudo apt install libapache2-mod-security2
sudo a2enmod security2
# SecRuleEngine On dans modsecurity.conf
Checklist de sécurisation
- Utiliser une whitelist pour les fichiers inclus
- Désactiver
allow_url_includedans php.ini - Configurer
open_basedir - Valider les chemins avec
realpath() - Restreindre les permissions des logs serveur
- Déployer un WAF (ModSecurity + OWASP CRS)
- Maintenir PHP à jour
Audit de code
# Détecter les inclusions potentiellement vulnérables
grep -rn "include|require" /var/www/html/ | grep -E "\$_(GET|POST|REQUEST|COOKIE)"
- La whitelist est la protection la plus efficace : n’autorisez que les fichiers connus
open_basedir+allow_url_include = Offsont les deux directives php.ini essentiellesrealpath()neutralise la traversée de répertoires en résolvant le chemin absolu réel

-
Add a note