我正在尝试制作一个只列出文件夹中文件夹的脚本。问题是我有用户可以在他们的文件夹中创建文件夹,所以基本上我正在尝试做的是让用户管理他们的文件夹和存储文件......我的问题是我想制作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;
}
答案 0 :(得分:2)
不允许为用户提供绝对路径,而只允许它们指定相对于给定基本路径的路径。接下来,编写一个函数,删除相对路径的任何“/../”并且您是安全的(只要用户无法在服务器上创建链接......)。
如果你想变得漂亮,你可以将“..”与之前的元素相匹配(所以“a /../ b”会变成“b”,即“..”删除“a” )如果之前没有路径元素,则忽略“..”。
答案 1 :(得分: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
传递文件夹,您希望成为最顶层的文件夹。通过realpath
两个路径,确保它们被解析为绝对路径。如果$folderPath
低于$homeFolder
,则$folderPath
字符串将以#{1}}字符串开头并包含整个$homeFolder
字符串。如果是这种情况,我们只需$folderPath
$folderPath
中的所有目录,并在数组中返回它们的绝对路径。
要从$homeFolder
获取ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
的相对路径,只需执行
./code/php/
将返回{{1}}。
如果您想使用OOP执行此操作,您可能会对glob
感兴趣。