2010-09-01 4 views
0

J'ai construit un système permettant aux utilisateurs de démarrer un projet et de télécharger des fichiers dans ce projet. Quand ils créent le projet, je crée un répertoire spécifique pour ce projet et tous les téléchargements remplissent ce répertoire. Cependant, j'ai mis en place un système qui permet à l'utilisateur de supprimer ce projet s'il le souhaite, en supprimant tous les fichiers dans le répertoire puis le répertoire lui-même. Localement (sur MAMP), cela a fonctionné un charme; sur un serveur live cependant, ce n'est pas le cas. Pour la suppression de l'annuaire, j'ai utilisé un morceau de code d'un site Web tutoriel (posté ci-dessous) et comme je l'ai dit, fonctionne très bien sur un serveur web local.PHP Itérer et supprimer des problèmes de répertoire

$name = $_POST['projectName']; 
rrmdir("../../project/$name"); 

    function rrmdir($dir) { 
    if (is_dir($dir)) { 
     $objects = scandir($dir); 
     foreach ($objects as $object) { 
      if ($object != "." && $object != "..") { 
       if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); 
      } 
     } 
     reset($objects); 
     rmdir($dir); 
     echo "Directory Removed"; 
    } 
+0

Avez-vous les autorisations appropriées définies sur le dossier via CHMOD? –

+0

serait-ce 777? Je le pense, mais le script semble s'arrêter juste après l'appel de la fonction. Sous la ligne rrmdir (...) j'ai quelques échos et ils ne tirent pas du tout. –

Répondre

2

Essayez plutôt celui-ci:

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/project/directory'), 
    RecursiveIteratorIterator::CHILD_FIRST); 

foreach($iterator as $fileObject) { 
    if($fileObject->isFile()) { 
     echo 'Removing File: ', $fileObject->getRealpath(), PHP_EOL; 
     // unlink($fileObject->getRealpath()); 
    } elseif($fileObject->isDir()) { 
     echo 'Removing Dir: ', $fileObject->getRealpath(), PHP_EOL; 
     // rmdir($fileObject->getRealpath()); 
    } 
} 

Uncomment les rmdir et unlink lignes pour réaliser effectivement les déménagements.

3

Soyez très prudent avec ceci:

$name = $_POST['projectName']; 
rrmdir("../../project/$name"); 

C'est comme une injection SQL pour le système de fichiers de votre serveur, imaginez si quelqu'un tape ceci dans leur navigateur: http://www.yoursite.com/this-script.php?projectName=../../../../var/www Vous aurez probablement envie de regarder escapeshellarg() pour aider à fermer ce trou de sécurité béante et realpath() pour convertir le chemin relatif en un absolu. Si le répertoire cible n'est pas vide, alors rmdir ne fonctionnera pas, vous devez d'abord supprimer tous les sous-répertoires et fichiers avant que rmdir ne fonctionne.

+0

Merci pour cela, mais le post vient d'une liste déroulante de leurs projets, ce champ n'est pas modifiable. Merci bien –

+0

Un formulaire est juste une interface graphique pour les données POST réelles. Ces données POST sont facilement falsifiées ou peuvent être interceptées et altérées avec un addon tel que Tamper Data (https://addons.mozilla.org/fr/firefox/addon/966/). Voici une excellente application/enseignement dans la sécurité Web: http://google-gruyere.appspot.com/ –

Questions connexes