Распознавание корневого каталога в PHP - PullRequest
0 голосов
/ 25 января 2010

Я пишу функцию PHP, которая удалит все файлы в каталоге, который был передан ей (и, возможно, расширит ее до рекурсивного удаления). Чтобы быть в безопасности, я хочу убедиться, что из-за ошибки или чего-то еще я не пытаюсь ничего удалить, если переданный каталог является корневым каталогом.

Права доступа к файлам должны защищать меня в значительной степени, но на всякий случай, и особенно если я расширю его до рекурсивного удаления, я просто хочу сделать этот дополнительный шаг.

В качестве усложняющего фактора этот код может быть запущен на машине с Windows или Linux, поэтому корневой каталог может выглядеть как «C: \» или «/». Я предполагаю, что есть и другие способы, которые действительно ссылаются на корень, возможно, 'c: \ temp ..'

Итак, есть ли в PHP надежный способ распознать, что спецификация dir преобразуется в корень файловой системы?

Разработка ...

Я пишу тесты PHPUnit для веб-приложения и пытаюсь создать инфраструктуру, в которой резервное копирование состояния приложения выполняется до запуска тестов, а затем восстанавливается. Приложение позволяет пользователям загружать файлы. В зависимости от того, что это за файл, он копируется в один из нескольких возможных каталогов.

Чтобы сохранить и восстановить состояние приложения, эти каталоги нужно куда-то скопировать, запустить тесты, а затем каталогам необходимо удалить свои файлы и извлечь их из резервной копии.

Расположение этих каталогов может различаться на разных машинах, и я знаю, что некоторые люди помещают их за пределы веб-приложения. Существует тестовый файл, который может быть прочитан тестом, в котором указано расположение этих каталогов для данного компьютера.

Если я не ограничиваю все эти каталоги определенным деревом каталогов, сложно выполнить заключение. Если я ограничу эти каталоги определенным деревом каталогов, тогда некоторым людям придется перенастроить свои машины.

Ответы [ 3 ]

3 голосов
/ 25 января 2010

У вас должна быть определенная корневая папка, которую вы никогда не идете выше, например, jailing. Корневая папка - не единственная папка, в которой можно нанести серьезный ущерб.

Редактировать.

Хотя я все еще выступаю за использование какого-либо вида джейлинга, я полагаю, что вы могли бы распознать корневую папку, удалив любые буквы дисков и переведя \ в /. В этом случае корневая папка всегда будет одной /.

function isRootFolder($dirpath) {
    list($drive, $path) = explode(':', str_replace('\\', '/', $dirpath), 2);

    return $path == '/';
}
0 голосов
/ 25 января 2010

Я использую это:

if (dirname($target)==$target) { // you're at the root dir

(переносимо между Microsoft и всем остальным)

С

0 голосов
/ 25 января 2010

Попробуйте, эта функция:

function is_root_dir($path)
{
    $clean_path = realpath($path);
    if($clean_path == '/' || preg_match('/[a-z]:\\/i', $clean_path))
    {
        return true;
    }
    else
    {
        return false;
    }
}

Это не проверено, я просто написал это в редакторе здесь. realpath () разрешает путь, следуя символическим ссылкам и решая такие вещи как: c: \ temp .. == c: \

Редактировать: В конце вы должны следовать совету, который дал вам nikc, определить список каталогов, которые можно безопасно удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...