PHP et unlink(): plus de sécurité

J'ai récemment joué avec PHP pour réaliser un petit script d'upload et de partage de fichiers pour ma copine.

À un moment donné, j'ai dû fournir la possibilité de supprimer des fichiers, et c'est alors que j'ai touché plus en profondeur à la fonction unlink() de PHP.

L'un des problèmes, avec cette fonction, c'est qu'on lui passe un nom de fichier à supprimer, et ça pose de gros problèmes de sécurité. Si jamais quelqu'un a connaissance du fichier PHP qui permet de supprimer quelque chose, il peut envoyer n'importe quel nom à supprimer et vider mon/votre site très facilement (imaginez un unlink("../index.html") dans un répertoire quelconque et il vous supprime votre page d'accueil).

Bref, l'astuce que j'ai utilisée: prendre le basename du fichier passé en paramètre pour être sûr que la suppression se réalise dans le dossier voulu.

Au final, ça ressemble à ça:

if (isset($_GET['unlink'])) {
   $fullPath = basename($_GET['unlink']);
   if (is_file($fullPath))
   {
       $success = unlink($fullPath);
   }
   // refresh page
   header( 'Location: .' ) ;
   exit(0);
   break;
}

Bon après, il faut s'assurer que tous les fichiers que vous avez dans ce répertoire sont "supprimable"; si vous laissez traîner un fichier que vous souhaitez garder, faites un filtre avant d'executer unlink().

blogroll