S�curit� des fichiers

Sommaire

PHP est soumis aux r�gles de s�curit� intrins�ques de la plupart des syst�mes serveurs : il respecte notamment les droits des fichiers et des dossiers. Une attention particuli�re doit �tre port�e aux fichiers ou dossiers qui sont accessibles � tout le monde, afin de s'assurer qu'ils ne divulguent pas d'informations critiques.

Puisque PHP a �t� fait pour permettre aux utilisateurs d'acc�der aux fichiers, il est possible de cr�er un script qui vous permet de lire des fichiers tels que /etc/password, de modifier les connexions ethernet, lancer des impressions de documents, etc. Cela implique notamment que vous devez vous assurer que les fichiers manipul�s par les scripts sont bien ceux qu'il faut.

Consid�rez le script suivant, o� l'utilisateur indique qu'il souhaite effacer un fichier dans son dossier racine. Nous supposons que PHP est utilis� comme interface web pour g�rer les fichiers, et que l'utilisateur Apache est autoris� � effacer les fichiers dans le dossier racine des utilisateurs.

Exemple #1 Une erreur de v�rification de variable conduit � un gros probl�me

<?php
// Efface un fichier dans un dossier racine
$username $_POST['user_submitted_name'];
$userfile $_POST['user_submitted_filename'];
$homedir  "/home/$username";

unlink("$homedir/$userfile");

echo 
"Ce fichier a �t� effac� !";
?>

�tant donn� que le nom de l'utilisateur et le nom du fichier sont fournis, des intrus peuvent envoyer un nom d'utilisateur et un nom de fichier autres que les leurs, et effacer des documents dans les comptes des autres utilisateurs. Dans ce cas, vous souhaiterez utiliser une autre forme d'identification. Consid�rez ce qui pourrait se passer si les utilisateurs passent ../etc/ et passwd comme arguments! Le code serait ex�cut� tel que :

Exemple #2 Une attaque du syst�me de fichiers!

<?php
// efface un fichier n'importe o� sur le disque dur,
// o� l'utilisateur PHP a acc�s. Si PHP a un acc�s root :
$username $_POST['user_submitted_name']; // "../etc"
$userfile $_POST['user_submitted_filename']; // "passwd"
$homedir  "/home/$username"// "/home/../etc"

unlink("$homedir/$userfile"); // "/home/../etc/passwd"

echo "Ce fichier a �t� effac� !";
?>

Il y a deux mesures primordiales � prendre pour �viter ces manoeuvres :

  • Limiter les permissions de l'utilisateur web PHP.
  • V�rifier toutes les variables li�es aux chemins et aux fichiers qui sont fournis.

Voici un script renforc� :

Exemple #3 Une v�rification renforc�e

<?php
// Efface un fichier sur le disque o� l'utilisateur a le droit d'aller
$username $_SERVER['REMOTE_USER']; // utilisation d'un m�chanisme d'identification
$userfile basename($_POST['user_submitted_filename']);
$homedir  "/home/$username";

$filepath "$homedir/$userfile";

if (
file_exists($filepath) && unlink($filepath)) {
   
$logstring "$filepath effac�\n";
} else {
   
$logstring "�chec lors de l'effacement de $filepath\n";
}
$fp fopen("/home/logging/filedelete.log""a");
fwrite($fp$logstring);
fclose($fp);

echo 
htmlentities($logstringENT_QUOTES);
?>

Cependant, m�me cette technique n'est pas sans faille. Si votre syst�me d'identification permet aux utilisateurs de cr�er leur propre login, et qu'un utilisateur choisi le login ../etc/, le syst�me est de nouveau expos�. Pour cette raison, vous pouvez essayez d'�crire un script renforc� :

Exemple #4 V�rification renforc�e de noms de fichiers

<?php
$username     
$_SERVER['REMOTE_USER']; // utilisation d'un m�chanisme d'identification
$userfile     $_POST['user_submitted_filename'];
$homedir      "/home/$username";

$filepath     "$homedir/$userfile";

if (!
ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD'$userfile)) {
   die(
"Mauvais utilisateur/nom de fichier");
}

//etc...
?>

Suivant votre syst�me d'exploitation, vous devrez prot�ger un grand nombre de fichiers, notamment les entr�es de p�riph�riques, (/dev/ ou COM1), les fichiers de configuration (fichiers /etc/ et .ini), les lieux de stockage d'informations (/home/, My Documents), etc. Pour cette raison, il est g�n�ralement plus s�r d'�tablir une politique qui interdit TOUT sauf ce que vous autorisez.