0

我正在尝试制作一个仅列出文件夹中文件夹的脚本。问题是我的用户可以在他们的文件夹中创建文件夹,所以基本上我要做的是让用户有一种方法来管理他们的文件夹和存储文件......我的问题是我想制作 php “认为“根文件夹是他们的主目录,他们不能高于他们的主目录。目前我的php函数不这样做,它只显示目录的内容......如果用户上一层又上一层......等等......他可以浏览整个硬盘驾驶。

function directoryList($path) {
    $dirStruct = array();
    if(is_dir($path)) {
        $handle = opendir($path);
        while(($file = readdir($handle)) !== false) {
            if(@opendir($path.$file)) {
                chdir($path.$file);
                $absolutepath = getcwd();
                $dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file);
            }
        }
    }
    return $dirStruct;
}
4

2 回答 2

2

而不是给用户一个绝对路径,只允许他们指定相对于给定基本路径的路径。接下来,编写一个删除相对路径的任何“/../”的函数,这样你就安全了(只要用户不能在服务器上创建链接......)。

如果你想好看,你可以将“..”与之前的元素匹配(所以“a/../b”会变成“b”,即“..”删除“a”)或忽略".." 如果它之前没有路径元素。

于 2010-06-28T15:59:13.953 回答
0

这里有一些需要扩展的东西:

function listFolders($folderPath, $homeFolder)
{
    $folderPath = realpath($folderPath);
    $homeFolder = realpath($homeFolder);
    if(strpos($folderPath, $homeFolder) === 0) {
        return glob("$folderPath/*", GLOB_ONLYDIR);
    }
}

$dirs = listFolders('/home/gordon/code/php', '/home/gordon');
print_r($dirs);

因为$folderPath您传入要从中列出目录的文件夹。对于$homeFolder传递您想要成为最顶层文件夹的文件夹。通过realpathing 两条路径,您可以确保它们被解析为绝对路径。如果$folderPath低于$homeFolder,则$folderPath字符串将以 开头并包含整个$homeFolder字符串。如果是这种情况,我们只需glob将所有目录都放在数组中,$folderPath然后将它们的绝对路径返回到一个数组中。


要获取$folderPathfrom 的相对路径$homeFolder,只需执行

ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');

这将返回./code/php/


如果您想使用 OOP 执行此操作,您可能对SPL DirectoryIterator感兴趣。

于 2010-06-30T23:36:09.407 回答