список каталогов с ограничениями - PullRequest
0 голосов
/ 28 июня 2010

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

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Вместо того, чтобы давать пользователю абсолютный путь, разрешите ему указывать только пути, относящиеся к данному базовому пути. Затем напишите функцию, которая удаляет любые «/../» для относительного пути, и вы в безопасности (если пользователи не могут создавать ссылки на сервере ...).

Если вы хотите быть милым, вы можете сопоставить «..» с элементом до этого (так что «a /../ b» станет «b», то есть «..» удалит «a») ) или игнорируйте "..", если перед ним нет элемента пути.

0 голосов
/ 01 июля 2010

Вот кое-что для расширения:

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 перейдите в папку, которую вы хотите быть самой верхней папки.* * * * Используя оба пути, вы убедитесь, что они разрешены до абсолютных путей.Если $folderPath ниже $homeFolder, тогда строка $folderPath будет начинаться и содержать всю строку $homeFolder.Если это так, мы просто glob всех каталогов в $folderPath и возвращаем их абсолютные пути в массиве.


Чтобы получить относительный путь $folderPath из $homeFolder, просто сделайте

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

, который вернет ./code/php/.


Если вы хотите сделать это с ООП, вас может заинтересовать SPL DirectoryIterator .

...