Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Php.ini : "dist" ou "recommended" ?

Je m'aperçois que la plupart des fichiers de configuration de PHP (php.ini) déployés sur les serveurs de production ne sont pas correctement paramétrés. Et d'ailleurs, les deux fichiers de configuration livrés avec les dernières distributions de PHP sont assez incohérents.

En effet, si vous lisez les en-têtes de ces fichiers (et pour peu que vous connaissiez l'anglais), vous remarquerez que le php.ini-dist ne devrait pas être utilisé en production [1], mais uniquement en développement [2]. La version php.ini-recommended est quant à elle réservée pour la performance et la sécurité, mais il n'est indiqué nulle part qu'elle est réservée à la production.

Pourtant, la grande majorité des sites Internet utilisent la version "dist".

Oui, c'est vrai ça, pourquoi ?

C'est simple, PHP3 ne disposait que d'un seul fichier de configuration qui était nommé php.ini-dist. Ce fichier comprenait l'ensemble des valeurs par défaut, mais devait être édité puis renommé car certaines options devaient être adaptées comme le include_path par exemple.

Seulement, ces paramètres n'étaient pas vraiment optimisés et leur utilisation par défaut pouvait engendrer des problèmes de sécurité. C'est pourquoi, lors de la sortie de PHP 4.0 RC2, un nouveau fichier de configuration a vu le jour : php.ini-optimize. Malheureusement, l'utilisation de celui-ci engendrait des problèmes d'incompatibilité à commencer par le register_globals à "off" (lire "Variables auto-déclarées : Pourquoi c'est mal ?"). Alors, au lieu d'adapter ce fichier de configuration pour rester compatible, les administrateurs ont préféré continuer à utiliser la version "dist".

Cependant, les erreurs de programmation favorisées par register_globals étaient toujours là, et on continuait à utiliser la version "dist". C'est pourquoi, lors de la sortie de la version 4.1.0, le fichier php.ini-optimize a été renommé en php.ini-recommended et les développeurs de PHP encourageaient fortement l'utilisation de ce dernier.

Mais rien ne changea, si vous ne mettez pas le nez du chien dans ses propres déjections, il ne comprendra pas ! Ainsi, lors de la sortie de la version 4.2.0, register_globals est passé à "off" dans le fichier "dist", et cette transition fut difficile pour nombre d'entre nous qui ont dû passer des heures à expliquer et à répéter les raisons de ce choix. En fait, la très grande majorité des utilisateurs ne se préoccupait pas de savoir ce que pouvait bien contenir ce fameux fichier de configuration, ils appliquaient bêtement les notices d'installation qui continuaient à dire "renommez le fichier php.ini-dist en php.ini", seulement, ce n'était plus suffisant, il fallait mettre les mains dans le cambouis et modifier la ligne "register_globals" si on n'avait pas le courage de changer ses habitudes de développement.

Pire, EasyPHP, qui permet d'installer PHP très facilement sur Windows, a sorti une version 1.6 intégrant PHP 4.2.0, mais avec le register_globals à "on", et beaucoup de débutants ont continué à développer avec les variables auto-déclarées. Ce n'est qu'au passage à la version d'EasyPHP 1.7 que le register_globals est passé à "off", et je ne vous dis pas le merdier que ça a mis (encore aujourd'hui) !

Bon, ok pour l'historique, mais je fais quoi maintenant ?

En fait, la version "dist" ne devrait être utilisée que pour les développements, seulement, ce fichier n'affiche pas toutes les erreurs (lire "Notice: Undefined variable (ou index)") et présente encore des incompatibilités avec la version recommended ce qui est assez paradoxal, non ?

J'utilise directement le recommended alors !

Malheureusement, en développement, ce fichier n'affichera pas les erreurs (display_errors = off ), c'est pourquoi, je vous conseille d'utiliser cette version en production et lors de vos développements, de l'utiliser également, mais en modifiant les paramètres suivant :
display_errors = on
log_errors = off

J'ajouterai qu'en production ou en développement, le short_open_tag devrait être à off (lire "Pourquoi il ne faut pas utiliser les balises courtes ?") et le error_reporting toujours à E_ALL.

Avec ce type de configuration, vous devrez certainement changer des choses dans vos habitudes et dans vos anciens scripts, mais tout ça va dans le sens de la sécurité et de la rigueur.

Attention : magic_quotes_gpc est à off, alors faites extrêmement attention aux problèmes de sécurité que cela peut induire (injection SQL par exemple).
Note

[1] : Quand on parle d'une application en production, cela indique que l'application est disponible pour le public et non plus en test ou en développement.

[2] : Extrait du php.ini-dist de la version 5.0.2 : "By default, PHP installs itself with a configuration suitable for development purposes, and *NOT* for production purposes."

Par Frédéric Bouchery
ADAM Benjamin 2008 | Admin