Первый сайт на PHP

"Калькулятор параметров доступа" из CuteFTP



Рисунок 11.11 . "Калькулятор параметров доступа" из CuteFTP


Теперь начнем копировать файлы из исходной папки в новосоздан-ную (используем старый добрый сценарий "папкопотрошилки"): исходная папка при этом - $f Id. " /" . $шп, а новосозданная -

$tgt."/".$nm.

$hdl=opendir($fld."/".$nm) ; while ($file = readdir($hdl)) { if (($file!=" . .")&&($file! = "."))

Если очередной объект из "потрошимой" папки $f Id. " / " . $nm -директория...

if (is_dir($fld."/".$nm."/".$file)==True) {

о применим рекурсию - вновь вызовем функцию с ору fold, только араметры ей уже передадим несколько другие:

copyfold($fld."/".$nm, $file, tgt."/".$nm);

Другими словами, в качестве имени копируемой папки - указываем мя очередного обьекта, найденного в "потрошимой" папке. Остальные передаваемые функции параметры представляют собой соответственно имя "родительской" папки для копируемой (это имя "потрошимой" папки), имя папки назначения (составлено из исходного имени апки назначения и имени копируемой папки, эта папка, кстати, как вы, наверное, помните, была создана командой mkdir в начале работы функции).

Если же очередной объект из "потрошимой" папки $f Id." /" . $nm является обычным файлом...

}

else

{



то просто скопируем его из исходной папки в папку назначения -и дело с концом.

copy ($fld."/".$nm."/".$file, $tgt."/".$nm."/".$file);

Примечание:

Функция copy (исходный файл, файл на месте назначения) копирует файл, полный путь к которому указан в первом параметре, в тот файл, полный путь к которому указан во втором параметре. Если копирование не удается, то функция выводит сообщение об ошибке (можно отключить, поместив символ @ перед командой) и возвращает false.

Если файл назначения уже существует, он будет перезаписан без вывода какого-либо подтверждения.

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


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);

Комментарий:

Как вы помните, на страницу запроса информации мы поместили специальный код, который составлял список папок, могущих быть пунктом назначения для копирования. В этом коде также отслеживалось, не является ли очередная папка из этого списка вложенной папкой какой-нибудь из копируемых папок, и таковые папки из списка удалялись. Это и понятно, копирование папки в свою же вложенную папку приведет либо к "подвисанию" web-сервера, если он не очень хорошо сконфигурирован, либо к забиванию аккаунта множеством папок и файлов (это связано с тем, что рекурсивная функция копирования в таком случае войдет в бесконечный цикл).

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



Чтобы сделать такие действия невозможными, на странице выполнения действия можно проверять, не вложена ли папка назначения копирования в копируемую папку. Для этого проще всего сравнить полные имена этих папок. Если полное имя копируемой папки можно найти в начале полного имени папки назначения, то копирование выполнять нельзя. Для сравнения проще всего воспользоваться функцией strpos (справку по ней смотрите в начале этой главы):

if (!(strpos ($rd, $?older."/".$i)===0)) { copyfold($folder, $i, $rd);

}

Хотя, бесспорно, в данном сценарии такая "защита", скорее, является демонстрационной - если посетитель имеет возможность загружать на аккаунт любые файлы, то никто не помешает ему загрузить на него какую-нибудь вредоносную программу на РНР и выполнить ее.

Если же очередной объект - файл...

}

else {

то его скопируем.

copy ($folder."/".$i, $rd."/".$i);

Осталось закрыть фигурными скобками запущенные циклы и условные операторы.

} }

}

Процесс копирования завершен (Рисунок 11.12).


Содержание раздела