PHP Итерация и устранение проблем с каталогами - PullRequest
0 голосов
/ 01 сентября 2010

Я построил систему, с помощью которой пользователи могут запускать проект и загружать файлы в этот проект.Когда они создают проект, я создаю каталог специально для этого проекта, и все загрузки заполняют этот каталог.Тем не менее, я реализовал систему, которая позволяет пользователю удалить этот проект, если он пожелает, удалив все файлы в каталоге, а затем и сам каталог.

Локально (на MAMP) это сработало;на живом сервере, однако, это не так.Для удаления каталога я использовал стандартный кусок кода с учебного сайта (размещен ниже) и, как я уже сказал, отлично работает на локальном веб-сервере.

$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";
    }

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Будьте очень осторожно с этим:

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

Это похоже на SQL-инъекцию для файловой системы вашего сервера, представьте, если кто-то напечатает это в своем браузере: http://www.yoursite.com/this-script.php?projectName=../../../../var/www Возможно, вы захотите взглянуть на escapeshellarg () , чтобы помочь закрыть эту зияющую дыру в безопасности, и realpath () , чтобы преобразовать относительный путь в абсолютный.Если целевой каталог не пуст, тогда rmdir не будет работать, вам нужно сначала удалить все подкаталоги и файлы, прежде чем будет работать rmdir.

2 голосов
/ 01 сентября 2010

Попробуйте вместо этого:

$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());
    }
}

Раскомментируйте строки rmdir и unlink, чтобы фактически выполнить удаление.

2 голосов
/ 01 сентября 2010

Заметив, что вы используете относительные пути, посмотрите, поможет ли этот комментарий: http://php.net/manual/en/function.unlink.php#85938

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...