Outils pour utilisateurs

Outils du site


effacement_par_php

Effacement récursif de répertoires créés par script php

Problématique:

Quand on utilise dans un site web avec un serveur apache sous linux des programmes php type “cms” (gestionnaire de contenu: forum, blog, wiki, galerie photo, etc…), il se pose un problème quand on veut les supprimer: certains répertoires ou certains fichiers ne peuvent pas être supprimés par la liaison ftp utilisée pour gérer le site.

Le même problème peut se produire en cas de piratage: si le pirate a réussi à uploader ou modifier un script php, c'est celui-ci qui a pu, par exemple, télécharger des fichiers pornos qui, dès lors, ne peuvent pas non plus être supprimés par une liaison ftp.

Origine du problème

Trois choses importantes à savoir pour comprendre:

  • 1- tous les fichiers et répertoires qui sont uploadés par liaison ftp, appartiennent au login de la liaison ftp, et sont créés avec un chmod de 755 pour les répertoires et 644 pour les fichiers.
  • 2- tous les fichiers et répertoires qui sont créés par un script php, appartiennent à apache, et sont créés avec un chmod de 755 pour les répertoires et 644 pour les fichiers.
  • 3- le droit de créer, effacer ou renommer un fichier ne dépend que du droit d'écriture du répertoire dans lequel ça se passe.

C'est au titre du point 3 que l'installation de la plupart des cms nécessite de passer certains répertoires à chmod=777. Sans cela, les script php du cms serait incapables de créer un fichier dans ce répertoire.


Pour effacer un fichier ou un répertoire, la liaison ftp refusera dans le cas suivant:

- on a un répertoire “rep1” uploadé par ftp et passé par ftp à chmod=777

- dans ce répertoire “rep1”, un script php a créé un répertoire “rep2” qui, donc, appartient à apache

- dans ce dernier répertoire “rep2”, un script php a créé des fichiers “fic*”.


On voit bien pourquoi le répertoire “rep2” ne peut pas être supprimé par une liaison ftp:

- même si “rep1” le permettait (chmod=777), le répertoire “rep2” ne peut être effacé parce qu'il n'est pas vide.

- pour le vider, il faudrait effacer le contenu du répertoire “rep2”, mais la liaison ftp ne le peut pas, parce que le répertoire “rep2” ne lui donne pas le droit d'écriture!

- et, bien sûr, la liaison ftp ne peut pas élargir les droit de “rep2” parce qu'elle n'en est pas propriétaire.

Solution

La solution est évidente: il faut supprimer les fichiers et répertoires créés par un script php (et donc appartenant à apache), par un autre script php!

Script proposé:

<?php
// Effacement recursif d'un repertoire non vide
// ce script php est a uploader juste au dessus du repertoire a effacer
// et passer le repertoire qui contient le script a chmod=777
// donner le nom exact du repertoire sans slash derriere (ex: './test1')
//
 
$effacerep='./test1';
 
echo "Effacement récursif du répertoire", $afficherep, '<br /><br />';
 
function effacerepertoire($dir) {
    if (is_dir ($dir)) // si c'est un repertoire
        $dh = opendir ($dir); // on l'ouvre
    else {
        echo $dir, ' n\'est pas un repertoire valide'; // sinon on sort! Appel de fonction non valide
        exit;
        }
    while (($file = readdir ($dh)) !== false ) { //boucle pour trouver le contenu du repertoire
        if ($file !== '.' && $file !== '..') { // no comment
            $path =$dir.'/'.$file; // construction du chemin du fichier
            if (is_dir ($path)) { //si on tombe sur un sous-repertoire
                echo '<p style="font-weight: bold; border : 1pt solid #000000;">', $path, '</p>';
                echo '<div style="padding-left: 20px; border: 1pt dashed #000000;">'; // idem...
                effacerepertoire($path); // appel recursif pour lire a l'interieur de ce sous-repertoire
                echo '</div><br />';
                echo "effacement du rép",$path,'<br />';
                rmdir($path);
            }
            else {
                echo "effacement du fichier ",$path, '<br />';
                unlink($path);
            }
        }
    }
    closedir ($dh); // on ferme le repertoire courant
}
 
effacerepertoire($effacerep);
echo '<p style="font-weight: bold; border : 1pt solid #000000;">', "effacement du répertoire ", $effacerep, '</p>';
rmdir($effacerep);
?>

Utilisation:

Ce script (dans un fichier “effacerep.php” par exemple) doit être uploadé par ftp juste au dessus du répertoire à effacer.

Le répertoire qui contient le script doit appartenir à la liaison ftp et être passé provisoirement à chmod=777 par ftp.

Il faut préciser dans le code (donc avant le transfert par ftp) le nom exact du répertoire à effacer sans slash à la fin. Par exemple:

$effacerep='./test1';

NB: c'est volontairement que j'ai prévu de mettre le nom du répertoire à supprimer dans le script et pas en le passant comme paramètre de l'adresse http! Ça fait toujours un trou de sécurité de moins…

Ensuite, pour exécuter le script, il faut appeler la page php dans un navigateur web:

http://monsiteweb.com/chemin/effacerep.php

Il doit apparaitre dans la page du navigateur la liste de tous les répertoires et fichiers effacés dans l'ordre du parcours récursif.

Dernière opération: supprimer ce script php par liaison ftp! Ce ne serait vraiment pas normal que ce script reste dans votre site en dehors des périodes d'administration.

effacement_par_php.txt · Dernière modification: 2007/12/15 09:43 par tyrtamos

Outils de la page