PHP et la sécurité - Configuration & développement
[40 mn de lecture - paru le 6/1/2006 10:39:20 AM - Public : Confirmé]
|
   
|
Auteur
1 Configuration de Apache/PHP
1.1 Gestion des erreurs
Qui n’est jamais tombé sur un site vous affichant une belle erreur PHP à cause d’une erreur de connexion, d’un fichier introuvable ou autre bug ? Cela vous paraît anodin ? Peut-être pour vous, mais pour d’autres, il s’agit là d’une mine d’informations déballées gratuitement quand à l’architecture de votre site et de son fonctionnement !
En effet, ces informations qui vous aident lorsque vous développez, vont aussi guider de tierces personnes dans leurs désirs de flibusterie. Il convient donc d’opter pour une configuration différente de PHP lorsqu’il est exécuté dans un environnement de développement que lorsqu’il est dans un environnement de production.
1.1.1 Environnement de développement
Dans un environnement de développement, il convient donc d’afficher l’ensemble des erreurs afin de pouvoir y apporter facilement les corrections nécessaires. Voici les instructions à placer dans un fichier .htaccess :
# On reporte toutes les erreurs (E_ALL = 2047)
php_value error_reporting 2047
# Les erreurs sont affichées à l’écran
php_flag display_errors on
1.1.2 Environnement de production
Au contraire, dans un environnement de production, aucune information ne doit apparaître à l’écran, elles doivent être loguées et transmises aux administrateurs réseaux. Voici les instructions à placer dans un fichier .htaccess :
# On reporte toutes les erreurs (E_ALL = 2047)
php_value error_reporting 2047
# Les erreurs ne sont pas affichées à l’écran
php_flag display_errors off
# Les erreurs sont loguées
php_flag log_errors on
# On logue les erreurs dans un fichier inaccessible de l’extérieur
php_value error_log /chemin-vers-votre-site/php_errors.log
<Files "php_errors.log">
Order deny,allow
Deny from all
</Files>
1.1.3 Informations supplémentaires
Manuel PHP – Gestion des erreurs
Manuel PHP – Error_reporting
Manuel PHP – Modifier la configuration
1.2 Exposition de PHP
Cette partie traite de la sécurité par l’obscurité, une des facettes les moins efficaces de la sécurité, mais qui peut appuyer une politique de sécurité forte sur une application critique.
1.2.1 Phpinfo()
De nombreux sites ont parmi leurs pages web, une d’entre elles qui appelle la fonction phpinfo(). Ces pages peuvent être livrées avec certains scripts pour faciliter leur installation, ou créées par le développeur pour mieux connaître son environnement.
Cependant, ces pages recèlent d’informations quant aux versions de vos applicatifs (version apache, version php, etc..), aux emplacements de vos fichiers importants (chemin du site, chemin du log d’erreurs), et aux fonctions désactivées sur votre système.
Il convient donc de restreindre leur accès ou de les supprimer de votre système de fichier.
1.2.2 Entêtes HTTP : expose_php
PHP injecte dans les entêtes des réponses http une ligne indiquant sa version, cette information peut de la même manière que phpinfo() apporter des informations supplémentaires à une personne malintentionnée.
Voici un exemple d’entêtes d’une réponse HTTP :
HTTP/1.1 200 OK
Date: Sun, 30 Apr 2006 16:36:05 GMT
Server: Apache/2.2.0 (Unix) mod_ssl/2.2.0 OpenSSL/0.9.8a PHP/5.1.2
X-Powered-By: PHP/5.1.2
Last-Modified: Sun, 30 Apr 2006 15:14:52 GMT
Content-language: en
Connection: close
Content-Type: text/html; charset=utf-8
La ligne en rouge est celle ajoutée par php, pour la supprimer, il faut modifier le php.ini :
# Désactive l’entête spécifiant la version de PHP
expose_php off
1.2.3 Entêtes HTTP : ServerTokens
La ligne en orange dans les entêtes HTTP est elle inscrite directement par Apache qui un peu à la manière de phpinfo indique sa version, et les versions des modules utilisés.
Pour supprimer ces informations, il faut modifier httpd.conf :
# Valeurs possibles Full | OS | Minor | Minimal | Major | Prod
# Full donne le plus d’informations, Prod le moins.
# Valeur par défaut : Full
ServerTokens Prod
1.2.4 Informations supplémentaires
PHP Secure – phpinfo
Manuel PHP – Masquer PHP
Manuel Apache – ServerTokens
1.3 Directive register_globals
1.3.1 Explications
La directive PHP register_globals quand elle est activée, enregistre toutes les variables provenant de l’extérieur dans les variables internes. Ainsi toutes les variables des formulaires (POST/GET/FILE) et des cookies sont accessibles directement en précédant leur nom d’un dollar.
Ceci avait pour but de simplifier les scripts, puisqu’il n’y avait qu’un seul moyen d’accéder aux variables. Cependant, lorsque cette directive est activée, il est impossible de savoir d’où provient le contenu de la variable et peut ainsi conduire à de nombreux problèmes de sécurité du fait que l’initialisation des variables n’est pas obligatoire. Cette directive a donc été désactivée par défaut à partir de php 4.2
1.3.2 Exemple
Voici un exemple qui conduit à une faille de sécurité si la directive register_globals est activée.
-
<?php
-
if(checkUser($login,
$pass))
$valid
=
true;
-
-
if($valid)
-
include
'valid_users.php';
-
else
-
include
'visitors.php';
-
?>
En effet, si la page est appelée comme ceci http://domaine.com/faille.php?valid=1, la variable $valid prendra la valeur passée en paramètre et la condition ligne 4 inclura le fichier réservé aux utilisateurs valides.
1.3.3 Informations supplémentaires
Manuel PHP – Sécurité
|