2010-01-25 5 views
0

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

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

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

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

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

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

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

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

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

ответ

3

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

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

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

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

    return $path == '/'; 
} 
+0

Я подумал об этом, и мне нравится этот термин, «заключенный в тюрьму». Я думаю, что в некоторых системах Windows мне нужно учитывать каталоги в учетной записи пользователя, c: \ users \ ..., а также каталоги в веб-приложении c: \ wamp \ www \ ... так что заключение в тюрьму было бы трудным , Возможно, стоит переконфигурировать систему так, чтобы все затронутые dirs были в c: \ wamp \ ... Другое дело, хотя я согласен, что есть другие каталоги, где я бы не хотел случайно удалять все файлы, root - единственный тот, который, я думаю, будет генерировать ошибка. –

+0

Не могли бы вы уточнить, что именно вы пытаетесь выполнить? Я, или кто-то другой, мог бы дать вам более полезный ответ. –

+0

Разработка выше –

0

Try, эта функция:

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, определить список каталогов которые можно безопасно удалить.

0

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

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

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

C.

Смежные вопросы