![]() |
![]() |
![]() |
ФАЙЛ DO.PHP Сценарий этого файла выполняет выбранное посетителем действие и перенаправляет его назад на основную страницу файлового менеджера. <?php Целесообразность проверки содержимого переменной Sfolder на предмет возможности попытки взлома сайта может представиться сомнительной. Эта переменная передается посредством заголовка формы и в адресной строке не отображается, однако ничто не мешает злоумышленнику сохрацить страницу с формой запроса информации на свой жесткий диск, исправить ее содержимое и, заменив относительные ссылки на абсолютные, перейти с сохраненного варианта на страницу выполнения действия. Так что проверять переменную Sfolder на наличие в ней ссылки на родительский каталог (двух точек подряд), а также удостовериться, что путь, записанный в ней, начинается с имени корневой папки аккаунта, всё же необходимо. Если последнее неверно или в Sfolder можно найти две точки подряд, то дальнейшее выполнение кода прекращается: If Примечание: Хотя, бесспорно, если посетитель может загружать на свой аккаунт файлы с PHP-программами, и эти программы могут выполняться, никакие "защиты" в файловом менеджере не спасут сайт от взлома. Так что "защита" в этом сценарии является скорее демонстрацией. УДАЛЕНИЕ, ВЫПОЛНЕНИЕ ДЕЙСТВИЯ Для удаления файлов в РНР существует специальная команда - unlink. Примечание: Удалить этой командой файлы, чьи имена переданы со страницы запроса подтверждения удаления - дело трех строк кода. Однако наш сценарий, если вы помните, позволяет удалять и целые директории. Пустую директорию можно удалить командой rmdir, - но вот как сделать директорию пустой, как ее очистить от содержимого? Ведь в директории могут быть и вложенные папки, а в них - тоже вложенные. function delfiles($fId) Проанализируйте его сами. Думаю, вы легко поймете логику его работы: указанная в параметре функции папка сканируется сценарием, разобранным в главе "Папкопотрошилка", и если очередной найденный в ней объект является файлом, то он удаляется, а если объект представляет собой папку, то вызывается эта же функция, но в качестве параметра ей на сей раз передается имя этой папки. Рано или поздно функция дойдет до папок, содержащих одни файлы, и рекурсия начнет прерываться. После удаления всех файлов в папке удаляется и сама папка, так как она уже пустая. if ($udal!="") то каждый обьект, имя которого передано из формы на странице запроса подтверждения на удаление... foreach ($fl as $i) проверим на то, не является ли он директорией. if (is_dir($folder."/".$i)==True) Если является, то удалим все файлы в этой директории - рекурсивной функцией delf iles... delfiles ($folder."/".$i); а затем и саму, уже опустошенную директорию - командой rmdir. А если этот объект, подлежащий удалению, является обычным файлом... Рис. 11.10. Удаление выполнено КОПИРОВАНИЕ, ВЫПОЛНЕНИЕ ДЕЙСТВИЯ С копированием будет посложнее. Напомню, что из сценария запроса дополнительной информации передан массив Sfl, состоящий из имен копируемых файлов и папок, и переменная $rd, содержащая имя с полным путем к той папке, в которую планируется осуществить копирование. Ну и, разумеется, путь к текущей папке, в которой изначально и находятся копируемые файлы - $folder.
Рано или поздно функция дойдет до папок, содержащих только файлы, которые и станут прерывать рекурсию. if (file_exists($tgt."/".$nm)!=True) Примечание: Параметры доступа, или атрибуты файла или папки - это восьмеричное число, сообщающее web-серверу о том, что можно делать с файлом, которому эти параметры установлены. Например позволить его читать только другим сценариям на том же аккаунте, но не посетителям из Сети. Узнать о соответствии значений параметров доступа их восьмеричному представлению можно, например в FTP-клиенте CuteFTP, воспользовавшись его окном выставления атрибутов файла (рис.11.11), доступном через пункт "Chmod" меню правой кнопки мыши любого файла на сайте. "Owner permissions" - это раз решения для других программ на том же аккаунте, a "Public permissions" - для посетителей из Интернета. Вы можете разрешить или запретить три вида действий: чтение, запись и запуск на исполнение (последнее имеет смысл только для программ). Рис. 11.11 . "Калькулятор параметров доступа" из CuteFTP Теперь начнем копировать файлы из исходной папки в новосоздан-ную (используем старый добрый сценарий "папкопотрошилки"): исходная папка при этом - $f Id. " /" . $шп, а новосозданная - $tgt."/".$nm. Если очередной объект из "потрошимой" папки $f Id. " / " . $nm -директория... if (is_dir($fld."/".$nm."/".$file)==True) { о применим рекурсию - вновь вызовем функцию с ору fold, только араметры ей уже передадим несколько другие: copyfold($fld."/".$nm, $file, tgt."/".$nm); Другими словами, в качестве имени копируемой папки - указываем мя очередного обьекта, найденного в "потрошимой" папке. Остальные передаваемые функции параметры представляют собой соответственно имя "родительской" папки для копируемой (это имя "потрошимой" папки), имя папки назначения (составлено из исходного имени апки назначения и имени копируемой папки, эта папка, кстати, как вы, наверное, помните, была создана командой mkdir в начале работы функции). } то просто скопируем его из исходной папки в папку назначения -и дело с концом. Примечание: Обратите внимание, что, во-первых, имена файлов нужно указывать вместе с путем к ним, а, во вторых, имя "файла на месте назначения" - это то имя, которое будет у копируемого файла после завершения копирования, а отнюдь не только имя папки, в которую он копируется: copy ("/files/data/filel.htm", "/files/last/'filel.htm"); В качестве имен файлов могут выступать содержащие их строковые переменные. } и открытую "потрошимую" директорию: closedir($hdl); } Текст этой функции следует поместить перед разделом кода, выполняющимся в том случае, если в качестве действия над выбранными файлами выбрано копирование. Код же этот следующий. if ($copy!="") Переберем все объекты, подлежащие копированию: foreach ($fl as $i) if (is_dir($folder."/".$i)==True) то запустим функцию копирования папки, разобранную выше, передав ей нужные параметры. copyfold($folder, $i, $rd); Комментарий: Однако исключение вложенных папок из списка возможных пунктов назначения на странице запроса дополнительной информации не гарантирует невозможности начала такого копирования! Злоумышленник может сохранить страницу файлового менеджера со списком пунктов назначения копирования на своем компьютере, а потом, исправив относительные ссылки на абсолютные, добавить в локальную копию страницы новый возможный пункт назначения копирования, т. е. имя папки, вложенной в копируемую папку, а затем, пометив именно эту папку, запустить копирование, тем самым навредив владельцу сайта, на котором расположен файловый менеджер. if (!(strpos ($rd, $?older."/".$i)===0)) { copyfold($folder, $i, $rd); Хотя, бесспорно, в данном сценарии такая "защита", скорее, является демонстрационной - если посетитель имеет возможность загружать на аккаунт любые файлы, то никто не помешает ему загрузить на него какую-нибудь вредоносную программу на РНР и выполнить ее. } Осталось закрыть фигурными скобками запущенные циклы и условные операторы. } } Процесс копирования завершен (рис. 11.12).
Рис. 11.12. Файлы скопированы ПЕРЕИМЕНОВАНИЕ, ВЫПОЛНЕНИЕ ДЕЙСТВИЯ В том случае, если посетитель выбрал в качестве требуемого действия переименование, то на странице запроса дополнительной информации ему пришлось ввести новые имена для тех файлов и папок, переименовать которые он пожелал. Сценарию же выполнения действия передалось два массива со старыми и новыми именами этих обьектов -$afl и $rfl соответственно. if ($ren!="") Переберем все элементы массива со старыми именами - $af 1. Поскольку для совершения собственно переименования для каждого элемента массива со старыми именами нам также потребуется элемент массива $rf 1 с новыми именами под тем же порядковым номером, то перебирать эти элементы будем подряд, по номерам - с помощью цикла for: for ($i = 0; $i < sizeof($afl); $i++) Если новое имя не совпадает со старым и не является пустой строкой... if (($rfl[$i]!="")&($rfl[$i]!=$afl[$i])) то можно переименовывать. Однако посетитель вполне может в новом имени указать символы, которые недопустимы для имен файлов - от пробелов до слэшей. Возвращать посетителя на этап ввода имени с выведением ему сообщения о недопустимых символах не будем - просто заменим все такие символы на знаки подчеркивания: "_". Тем более что такую замену можно совершить специальной командой PHP - strtr: (Количество знаков подчеркивания в третьем параметре функции равно количеству указанных во втором недопустимых символов.) Примечание: Если столь длинная фраза вас смутила, то можно сказать проще: во втором и в третьем параметрах функции приводятся строки, состоящие из определенных символов. 1. Смотрит, какой символ стоит в строке в ее третьем параметре на том же самом месте от начала строки, что и встреченный символ в строке во втором параметре. strtr ("Оабвапабаво", "ба", "ру") будет строка "Оурвупуруво" Если строки во втором и третьем параметрах разной длины, то лишние символы в более длинной строке игнорируются. Поскольку на всех местах в строке в третьем параметре этой функции стоит знак подчеркивания, то все недопустимые символы, указанные в строке в ее втором параметре, будут на него заменены. rename ($folder."/".$af1[$i], $folder."/".$rfl[$i]) ; Примечание: Вот и все (рис. 11.13). Комментарий: Рис. 11.13. Файлы переименованы Рис. 11.14. Ошибка при переименовании - сообщение РНР А можно использовать несколько оригинальное решение - заранее посмотреть, есть ли в папке файл с таким же именем, как и то, которое пользователь желает дать переименовываемому файлу, и если есть, то добавить к новому имени файла спереди знак подчеркивания - "_". Код, реализующий это, прост: while (file_exists($folder."/".$rfl[$i])==True) Как нетрудно понять, он добавляет в начало нового имени файла знак "_", если файл с таким именем уже существует в той же папке, куда предполагается копировать файл. Если же и таковой файл - со знаком "_" в начале -уже в папке имеется, то к новому имени добавляется еще один такой символ, и так до тех пор, пока новое имя не станет уникальным. СОЗДАНИЕ НОВОЙ ПАПКИ, ВЫПОЛНЕНИЕ ДЕЙСТВИЯ Создание новой папки выполняет самый маленький фрагмент кода во всем сценарии. Даже меньше того, что выводил запрос имени для этой новой папки. if ($md!="") { Как и в сценарии переименования файла, исключим из имени новой папки недопустимые символы... $newname=strtr($newname, " []{},/\!@#$%л&*", и создадим папку - командой mkdir, не забыв указать в ее параметрах полный путь к новой папке: mkdir ($folder."/".$newname, 06 66); Описание команды mkdir вы уже видели выше - в подразделе "Копирование, выполнение действия". Собственно, и все (рис. 11.15). Рис. 11.15. Папка создана ЗАВЕРШЕНИЕ ДЕЙСТВИЯ Ну и по окончании выполнения действий перенаправим посетителя на основную страницу файлового менеджера - в ту же директорию, в которой он и находился, передав сценарию на основной странице путь к ней через переменную fold в адресной строке. Для этого воспользуемся командой Header, передающей браузеру заголовки. Header ("Location: index.php?fold=$folder"); Примечание: Сценарий можно завершить - посетитель уже на другой странице... |
![]() |
![]() |
![]() |