Вопрос

Я пытаюсь сделать сценарий, который перечисляет только папки в папке. Дело в том, что у меня есть пользователи, которые могут создавать папки в своих папках, так что в основном я пытаюсь сделать, это иметь способ для пользователей управлять своими папками и хранить файлы ... Моя проблема в том, что я хочу сделать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top