PHP迭代并删除目录问题

时间:2010-09-01 09:00:05

标签: php directory

我已经构建了一个系统,用户可以通过该系统启动项目并将文件上传到此项目。当他们创建项目时,我专门为该项目创建一个目录,所有上传都填充此目录。但是,我已经实现了一个系统,允许用户删除该项目,删除目录中的所有文件,然后删除目录本身。

在当地(在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 个答案:

答案 0 :(得分:3)

非常小心:

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

这就像是服务器文件系统的SQL注入一样,想象一下如果有人在浏览器中输入这个内容:http://www.yoursite.com/this-script.php?projectName=../../../../var/www您可能希望查看escapeshellarg()以帮助弥补这个巨大的安全漏洞realpath()将相对路径转换为绝对路径。如果目标目录不为空,则rmdir将不起作用,您需要先删除所有子目录和文件,然后才能使用rmdir。

答案 1 :(得分:2)

注意您使用相对路径,请查看此评论是否有帮助: http://php.net/manual/en/function.unlink.php#85938

答案 2 :(得分:2)

试试这个:

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

取消注释rmdirunlink行以实际执行删除。