5.1 Sécurité 
5 Sécurité 
 Manuel PHP 
 . Considérations générales . Binaires CGI . Module Apache ->Sécurité des fichiers . Sécurité des bases de données . Rapport d'erreurs . Utilisation des variables super-globales . Données transmises par les internautes . Masquer PHP . Etre à jour
 
  | 
 
  5.1.4 Sécurité des fichiers 
 
    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
    accédé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.
    
 
 | Une erreur de vérification de variable conduit à ... |  
<?php // Efface un fichier dans un dossier racine $username = $_POST['user_submitted_name']; $homedir = "/home/$username"; $file_to_delete = "$userfile"; unlink ($homedir/$userfile); echo "$file_to_delete a été effacé!"; ?>
 
 |   
 
    Etant donné que le nom de l'utilisateur est à fournir, des intrus peuvent
    envoyer un nom d'utilisateur autre que le leur, et effacer des
    documents dans les comptes des autres utilisateurs.
    Dans ce cas, vous souhaiterez utiliser une autre forme d'authentification.
    Considérez ce qui pourrait se passer si les utilisateurs passent
    "../etc/" et "passwd" comme arguments! Le code serait exécuté
    tel que :
     
| 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 = "../etc/"; $homedir = "/home/../etc/"; $file_to_delete = "passwd"; unlink ("/home/../etc/passwd"); echo "/home/../etc/passwd a été effacé!"; ?>
 
 |   
 
    Il y a deux mesures primordiales à prendre pour éviter
    ces manoeuvres :
     
- 
       Limiter les permissions du l'utilisateur web PHP.
      
 
- 
       Vérifier toutes les variables liées aux chemins et aux fichiers
       qui sont fournis.
      
 
 
 
    Voici un script renforcé :
     
| Une vérification renforcée |  
<?php // Efface un fichier sur le disque où l'utilisateur à le droit d'aller   $username = $_SERVER['REMOTE_USER']; // utilise un mécanisme d'authentification   $homedir = "/home/$username";   $file_to_delete = basename("$userfile"); // supprime le chemin excédentaire   unlink ($homedir/$file_to_delete);   $fp = fopen("/home/logging/filedelete.log","+a"); //note l'effacement   $logstring = "$username $homedir $file_to_delete";   fputs ($fp, $logstring);   fclose($fp);   echo "$file_to_delete a été éffacé!"; ?>
 
 |   
 
    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é :
     
| Vérification de noms de fichiers sécurisée |  
<?php   $username = $_SERVER['REMOTE_USER'];;   $homedir = "/home/$username";   if (!ereg('^[^./][^/]*$', $username))     die('Erreur de nom de fichier');     //meurt, ne SURTOUT pas traiter! //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.
    
 |