Иллюстрированный самоучитель по PHP

Файл do.php

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

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

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);
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.