En bref : pour les administrateurs sans profil développeur, cinq bases suffisent pour exploiter PHP en sécurité : PHP se compose de plusieurs programmes (ligne de commande, PHP-FPM, module Apache), chacun avec sa propre version ; les réglages agissent par niveaux, du php.ini à l'application ; PHP-FPM répartit les requêtes sur des workers dans des pools ; une mise à jour n'agit qu'après le redémarrage de tous les processus ; et les logs sont l'indice le plus important quand quelque chose ne va pas. Qui connaît ces points peut combler rapidement et de façon démontrable des failles comme PHP2Shell.
De quoi PHP se compose sur un serveur
PHP n'est pas un programme unique. Sur un serveur Linux typique, on trouve plusieurs variantes, chacune reliée via une interface serveur (SAPI) :
| Variante | Nom typique | Usage |
|---|---|---|
| Ligne de commande (CLI) | php, php8.3 |
tâches cron, Composer, scripts de maintenance |
| PHP-FPM | php-fpm, php-fpm8.3 |
requêtes web derrière Nginx ou Apache |
| Module Apache | mod_php, libphp |
requêtes web directement dans le processus Apache |
| CGI | php-cgi |
architectures plus anciennes |
Chaque variante peut avoir une autre version et un autre php.ini. Sur de nombreux serveurs, plusieurs versions de PHP tournent en outre en parallèle, par exemple 8.2 et 8.4. Lors d'une mise à jour, chacune doit être considérée séparément. Le fonctionnement des interfaces est expliqué dans PHP-FPM expliqué.
Vous trouvez quelle variante dessert réellement vos sites web grâce aux processus en cours et à la configuration du serveur web :
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php # Apache charge-t-il un module PHP ?
ls /run/php/ 2>/dev/null # sockets FPM, souvent par version et par pool
La colonne de l'heure de démarrage sera importante plus tard lors du redémarrage : tous les processus PHP doivent avoir été démarrés après le moment de la mise à jour. Si des processus tournent sous différents utilisateurs, cela indique des pools séparés, ce qui est bon. Si un module PHP apparaît dans Apache alors que tous les sites sont censés passer par FPM, c'est le signe d'un héritage à retirer. Pour les interfaces d'hébergement comme Plesk ou cPanel, le même principe s'applique, sauf que l'interface affiche les versions et les handlers par site web ; ce qui fait foi reste toutefois ce qui tourne réellement comme processus.
Les commandes les plus importantes pour les admins
php -v # version de la ligne de commande
php --ini # php.ini chargé et répertoires lus en plus
php --ini=diff # à partir de PHP 8.5 : écarts par rapport à la valeur par défaut
php -m # modules compilés et chargés
php --ri session # réglages d'une extension
php -l datei.php # vérification de syntaxe sans exécution
php-fpm8.3 -v # version du binaire FPM (nom selon la distribution)
php-fpm8.3 -t # tester la configuration FPM sans redémarrer
systemctl status php8.3-fpm
Deux remarques tirées du manuel : php -l trouve les erreurs de syntaxe, mais pas les erreurs qui n'apparaissent qu'à l'exécution. Et php -i appelle phpinfo() ; la sortie n'a pas sa place dans des fichiers publics du répertoire web.
Comment les réglages de PHP agissent
Un réglage peut être défini à plusieurs endroits. Qui peut modifier quoi et où est déterminé par le mode de modification de chaque directive :
- php.ini et conf.d : configuration de base par variante, lue au démarrage.
- Pool FPM :
php_valueetphp_admin_valuepar pool. Selon le manuel, l'application ne peut pas redéfinir parini_set()les valeurs fixées avecphp_admin_value. - Niveau répertoire :
.user.inipour FPM ou.htaccesspour mod_php, uniquement pour les directives en modeINI_PERDIRouINI_ALL. - Application :
ini_set()à l'exécution, uniquement pour les directives en modeINI_ALL.
Un exemple : memory_limit a le mode INI_ALL, peut donc être modifié par l'application. post_max_size a INI_PERDIR et ne peut pas être modifié par ini_set(). C'est pourquoi php.net exige, pour les mesures transitoires PHP2Shell, de définir les valeurs de façon que les applications ne puissent pas les redéfinir. Les détails sur les niveaux sont expliqués dans Le php.ini expliqué.
Les pools PHP-FPM en bref
Un pool est un groupe de workers avec son propre utilisateur, son propre socket et ses propres réglages. Les directives les plus importantes selon le manuel :
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic ; static, dynamic ou ondemand
pm.max_children = 20 ; au plus 20 requêtes simultanées
pm.max_requests = 500 ; renouveler le worker après 500 requêtes
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log
php_admin_value[error_log] = /var/log/php-fpm/shop-error.log
php_admin_flag[log_errors] = on
Un pool dédié par site web, avec son propre utilisateur, sépare les sites les uns des autres. security.limit_extensions est par défaut sur .php .phar et empêche FPM d'exécuter d'autres extensions de fichier que PHP. clear_env est activé par défaut et tient les variables d'environnement à l'écart du worker.
Logs : où les administrateurs doivent regarder
PHP écrit les erreurs vers la destination définie avec error_log, PHP-FPM en plus dans son propre log et, pour les requêtes lentes, dans le slowlog avec trace d'appels. S'y ajoutent les logs d'accès et d'erreurs du serveur web. Veillez à ce que display_errors soit désactivé en production et log_errors activé : les erreurs vont dans le log, pas sur la page web. Les logs devraient en outre être archivés par rotation et conservés pendant une durée définie, afin d'être encore disponibles en cas d'urgence. Après PHP2Shell, la presse spécialisée recommande de conserver les logs du serveur à partir du 20 octobre 2026. Un processus PHP-FPM ou serveur web qui lance un shell est un signal d'alerte fort ; la manière de le détecter est décrite sous Signal d'alerte : le serveur web lance un shell.
Liste de contrôle pour les admins après PHP2Shell
- Lister toutes les variantes et versions de PHP sur le serveur, y compris celles qui ne sont pas utilisées.
- Vérifier le niveau des paquets ; pour les rétroportages de la distribution, chercher CVE-2026-109618 et CVE-2026-109619 dans le journal des modifications.
- Mettre à jour vers 8.5.12, 8.4.27, 8.3.36 ou 8.2.35, ou vers le rétroportage confirmé.
- Redémarrer PHP-FPM, Apache et LiteSpeed et contrôler les heures de démarrage des processus.
- Contre-vérification avec
php -r 'var_dump(ini_get("memory_hard_limit_percent"));';bool(false)signifie, selon le manuel, une version concernée. - Sauvegarder les logs et les examiner à la recherche d'anomalies.
La manière de prouver de façon fiable la version et le niveau de correctifs est décrite dans Vérifier correctement la version de PHP et le niveau de correctifs.
Comment PHP SOS aide-t-il concrètement ?
Dans le contrat de maintenance de sécurité, nous assurons avec votre équipe l'entretien de base de PHP :
- Inventaire : toutes les variantes de PHP, versions, pools et emplacements de configuration par serveur.
- Configuration : valeurs importantes pour la sécurité définies avec
php_admin_value, pools séparés par site web. - Mises à jour : installation, redémarrage, contrôle et documentation à chaque version de sécurité.
- Transmettre le savoir : nous expliquons à vos administrateurs ce que nous avons modifié et pourquoi.
Questions fréquentes
Pourquoi php -v affiche-t-il une autre version que le site web ?
La ligne de commande, PHP-FPM et le module Apache sont des programmes distincts, avec leur propre version et leur propre php.ini. php -v n'affiche que la ligne de commande. Pour le site web, c'est la version du binaire qui traite réellement les requêtes qui compte.
Quel php.ini s'applique sur mon serveur ?
php --ini l'indique pour la ligne de commande. Pour PHP-FPM, il existe généralement un php.ini propre et des fichiers de pool supplémentaires. Depuis PHP 8.5, php --ini=diff montre quelles valeurs s'écartent de la valeur par défaut.
Quelle est la différence entre php_value et php_admin_value ?
Les deux définissent des réglages dans un pool FPM. Selon le manuel, l'application ne peut pas redéfinir avec ini_set() les valeurs fixées par php_admin_value. Pour les réglages importants pour la sécurité, php_admin_value est donc le bon choix.
Une mise à jour sans redémarrage suffit-elle ?
Non. Les processus PHP en cours d'exécution gardent l'ancien code en mémoire. Après une mise à jour, PHP-FPM, Apache avec mod_php ou LiteSpeed doivent être redémarrés, sinon la version vulnérable continue de tourner.