Tutoriel récapitulatif de sécurité (PHP5)Date de publication : 12 mai 2006 , Date de mise à jour : 12 mai 2006 II. Votre configuration PHP II-1. display_errors Dangers Configuration II-2. error_reporting Dangers Configuration Notes II-3. magic_quotes Dangers Configuration Notes II-4. register_globals Dangers Configuration Notes II. Votre configuration PHP
Vous devez adapter la configuration de votre serveur à l'environnement dans lequel il est utilisé. Il n'est pas imaginable d'utiliser la même configuration pour un serveur de développement et pour un serveur en production. En effet, le développeur a besoin de toutes les informations de débogage dont il peut disposer tandis que le visiteur doit, au contraire, recevoir le minimum possible d'informations sur votre système (si ces informations l'intéressent, c'est assurément qu'il a des intentions malicieuses). Il est possible de modifier les directives de configuration de PHP dans le fichier php.ini et parfois au moyen de fonctions PHP. II-1. display_errors
Cette directive, comme son nom l'indique clairement, permet d'activer ou de désactiver l'affichage de toutes les erreurs par le moteur PHP.
Dangers
Pour un utilisateur inexpérimenté, le danger est nul. Il se demandera ce qu'il se passe, retentera l'opération, obtiendra à nouveau l'erreur et se lassera. À l'inverse, pour un utilisateur expérimenté et curieux, certaines erreurs pourraient révéler des informations sensibles sur votre serveur et ainsi exposer des vulnérabilités qu'il sera certainement en mesure exploiter (du moins, nous partirons toujours de la supposition qu'il en est capable). Configuration
Pour un environnement de développement, il est conseillé d'utiliser :
Pour un environnement en production, il est conseillé d'utiliser (à moins que le développeur souhaite pouvoir afficher ses propres messages, cf. la directive suivante) :
II-2. error_reporting
Cette directive permet de déterminer quelles erreurs seront affichées.
Dangers
À part risquer de montrer au monde entier que votre site est mal codé (mauvaise gestion d'erreurs)... Sérieusement, pour un utilisateur expérimenté, cela peut lui indiquer comment il peut s'introduire dans votre application. Il est donc préférable d'adopter la technique de l'autruche et cacher ce que vous pouvez ! Configuration
S'il s'agit d'un serveur de développement ou bien si la directive display_errors est désactivée, nous pouvons tout afficher :
Dans les autres cas, il sera préférable de limiter l'affichage aux erreurs que le développeur souhaite afficher :
Je le répète : il est impératif que la directive error_reporting soit activée à E_ALL pendant la phase de développement afin d'assurer un minimum de qualité dans vos applications.
Notes
En PHP, la fonction error_reporting() permet de modifier cette directive jusqu'à la fin de la durée de l'exécution d'un script.
II-3. magic_quotes
Ces directives ont fait le succès de PHP en tant que Personal Homepage (c'est l'ancien nom de PHP), c'est-à-dire il y a bien longtemps, car elles simplifiaient la vie des développeurs. Depuis, les temps ont changé. Les utilisateurs malicieux sont devenus plus sournois, les applications sont devenues plus complexes. L'ajout automatique de slashes n'est pas la solution à tous les problèmes. De plus, elle peut générer des comportements que nous n'avons pas prévus. Il y a tellement d'exemples de jeunes développeurs qui s'étonnent de voir des slashes dans leurs variables ! Les directives magic_quotes servent à échapper automatiquement certains caractères (comme l'apostrophe ' et les guillemets ") en les préfixant d'un antislash \. Dangers
Le seul danger auquel je puisse penser est que le développeur fasse trop confiance à ces directives et qu'il ne vérifie pas les données lui-même quand c'est nécessaire.
Configuration
Quel que soit l'environnement d'exécution des scripts, il est recommandé de désactiver ces options car elles sont génériques (donc peu adaptées). De plus, il est probable qu'elles finissent par avoir des conséquences indésirables si vous oubliez d'annuler leur effet (présence d'antislashes \ dans votre base de données).
NotesEn PHP, plusieurs fonctions sont intimement liées à ces directives
II-4. register_globals
Voici l'autre directive de configuration qui a fait le succès de l'ancien Personal Homepage. Tout comme pour les magic_quotes, il a été prouvé depuis bien longtemps que, mal gérée, cette directive peut créer plus de problèmes qu'elle n'en règle.
Cette option a permis à PHP de devenir très célèbre il y a quelques années car cela le code était simplifié par son activation. En contrepartie, les développeurs prenaient moins garde au contenu de leurs variables, ce qui a fait paraître de nombreux problèmes de sécurité d'applications Web (et la mauvaise réputation de PHP sur ce point, alors que l'entière faute revient aux développeurs -dont j'ai fait partie, comme beaucoup-).
Dangers
Un utilisateur peut faire appel à votre script en ajoutant ses propres paramètres. Cette directive permet de transformer ces paramètres en variables locales. Dans certaines situations, cela peut remplacer vos variables locales du même nom. Dans d'autres, cela peut permettre à un utilisateur de sauter un test effectué dans votre code et d'atteindre une partie du code qu'il n'aurait pas dû pouvoir atteindre.
En bref : cette directive, si activée, vous enlève une grosse partie du contrôle que vous avez de votre application.
Appelez cette page en ayant avec la directive register_globals mise à On (et après avoir redémarré votre serveur Web pour appliquer les changements). Il ne se passe rien, puisque la $foo variable n'existe pas. Maintenant, appelez votre script en utilisant l'URL suivante : "test_globals.php?foo". Il n'y a même pas besoin de donner une valeur à la variable, il suffit de la mettre dans l'URL pour qu'elle soit créée. Résultat : nous rentrons dans le if alors que notre code est relativement correct ! Nous avions simplement supposé que la variable locale $foo ne pouvait que provenir de notre script, cela suffit pour qu'il possède une faille de sécurité. J'ai donné ici du code inoffensif car je ne souhaite pas indiquer comment faire planter un site Web. Mon objectif était de démontrer le danger de cette directive register_globals : j'espère y être parvenu avec cet exemple simpliste. Configuration
Notes
En PHP, la fonction ini_set() permet de modifier la configuration du serveur mais seulement si PHP est installé comme un module du serveur Apache. Je trouve que c'est bien peu fiable comme supposition. Se reposer sur sa disponibilité ne permet pas de développer des applications fiables ; par conséquent, il ne faut pas le faire.
|
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.