Список каталогов с ограничениями
-
01-10-2019 - |
Вопрос
Я пытаюсь сделать сценарий, который перечисляет только папки в папке. Дело в том, что у меня есть пользователи, которые могут создавать папки в своих папках, так что в основном я пытаюсь сделать, это иметь способ для пользователей управлять своими папками и хранить файлы ... Моя проблема в том, что я хочу сделать 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;
}
Решение
Вместо того, чтобы дать пользователю абсолютный путь, позвольте им указывать пути, которые относительно данного базового пути. Далее, напишите функцию, которая удаляет любую «/../» для относительного пути, и вы в безопасности (до тех пор, пока пользователи не могут создавать ссылки на сервере ...).
Если вы хотите быть хорошим, вы можете сопоставить «...» с элементом до этого (так «A /../ B» станет «B», то есть «..». Удалите «а») или игнорируйте «..» Если нет элемента пути до него.
Другие советы
Вот немного что-то, чтобы расширить:
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
строка начнется с и содержит весь $homeFolder
нить. Если это так, мы просто glob
Все каталоги в $folderPath
и вернуть свои абсолютные пути в массиве.
Чтобы получить относительный путь $folderPath
из $homeFolder
, просто делать
ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
который бы вернется ./code/php/
.
Если вы хотите сделать это с OOP, вы можете быть заинтересованы в SLL DALUITITERITER.