【问题标题】:directory listing with restrictions有限制的目录列表
【发布时间】:2010-06-28 15:55:12
【问题描述】:

我正在尝试制作一个仅列出文件夹中的文件夹的脚本。问题是我的用户可以在他们的文件夹中创建文件夹,所以基本上我要做的是让用户有一种方法来管理他们的文件夹和存储文件......我的问题是我想制作 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;
}

【问题讨论】:

    标签: php file-management folderbrowserdialog


    【解决方案1】:

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

    如果你想变得漂亮,你可以将“..”与之前的元素匹配(所以“a/../b”会变成“b”,即“..”删除“a” ) 或者如果前面没有路径元素,则忽略“..”。

    【讨论】:

    • 我假设“a/../b”是一个正则表达式。是吗?
    • 不,“..”是父目录。
    【解决方案2】:

    这里有一些东西可以扩展:

    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 开头并包含整个$homeFolder 字符串。如果是这种情况,我们只需 glob$folderPath 中的所有目录,并在数组中返回它们的绝对路径。


    要从$homeFolder 获取$folderPath 的相对路径,只需这样做

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

    这将返回./code/php/


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

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多