PHP: загрузка файла на сервер

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


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

Безопасность

Загрузка файлов на сервер при помощи PHP осуществляется довольно просто. Код очень простой и короткий. Он состоит всего из пары строк. Однако такой метод представляет определенную опасность. Намного больше времени и строк кода уходит на обеспечение безопасности. Опасность кроется в том, если не проводить специальных проверок, то любой злоумышленник сможет спокойно загрузить на ваш сервер свои скрипты. У него при этом будет полный доступ. Он может сделать совершенно все, что пожелает, например, удалить базы, изменить или удалить файлы сайтов, добавить на ваш сайт свою рекламу, загрузить вирусы, перенаправить всех пользователей на свои сайты и многое другое, что только может прийти в голову взломщику.  Поэтому лучше всегда проверять, что за файл пытается загрузить пользователей. Если, к примеру, вы загружаете только фотографии, то необходимо проверить, что данный файл точно является изображением. В противном случае к вам смогут загрузить что угодно. Далее будет показано, как именно можно реализовать проверку при непосредственном рассмотрении скрипта загрузки файлов.

Создание формы PHP

Форма загрузки файла выглядит довольно просто. Достаточно всего лишь кнопки обзора и кнопки загрузки. Не будем описывать создание формы, поскольку это довольно просто. Дальнейшие инструкции предполагают, что у вас имеются базовые понятия HTML. В противном случае вы бы не искали информацию о загрузке PHP. Стоит также обратить внимание на такой момент,что для передачи данных в форме необходимо будет добавить атрибут enctype, в противном случае данные о файле не будут передаваться обработчику.

Как же это функционирует? При нажатии на кнопку обзора у вас должно открыться окно, в котором вам будет предложено выбрать файл. После этого должен появиться путь, по которому файл расположен. Если этот путь не появится, то необходимо будет еще раз проделать данную процедуру. После того как вы нажмете на кнопку загрузки, файлом-обработчиком может быть выдана любая информация. Так, например, можно написать строку, в которой будет говориться, что файл с названием «таким-то» был загружен в папку «такую-то». Имя файла, разумеется, всегда будет выдаваться разное. Такую подробную информацию обычно используют для отладки кода. Так можно проверить, что за данные передаются. Также можно удостовериться в том, что запись осуществляется в нужную вам директорию. Это означает, что даже имя файла указывать не обязательно, так как это лишняя информация, которая не нужна пользователю.Вывод данных об имени имеет смысл только в том случае, если пользователь загружает сразу несколько файлов. В дальнейшем мы рассмотрим как раз такой случай, но пока не будем забегать вперед.

Настройка

Загрузка файла на сервер в PHP требует определенных настроек, которые необходимо осуществить в файле php.ini. В этом файле имеется множество различных настроек, однако не все они нужны. Нас будут интересовать конкретно три строчки: file_uploads, upload_max_filesize, upload_tmp_dir. Стоит обратить внимание на тот момент, что все настройки коснуться всех ваших сайтов на сервере, а не какого-то определенного. По этой причине максимальный размер необходимо задавать исходя из того, что у вас будут загружать пользователи. Слишком большие значения задавать не рекомендуется.  Когда вы измените значения в данных параметрах, сервер необходимо будет перезагрузить. В противном случае настройки не вступят в силу, поскольку считываются они в момент загрузки сервера. Сделать это можно в консоли, подключившись к серверу через SSH. Достаточно просто ввести команду servicehttpdrestart. После этого настройки должны вступить в силу.

Другой способ заключается в перезапуске при помощи панели ISP или через биллинг-панель провайдера.

Массив с файлом

Загрузка файла в PHP осуществляется при помощи массива $_FILES. В этом массиве содержится вся доступная информация о загружаемых файлах. Далее выберите любой файл и нажмите на кнопку «Загрузить». В результате на странице обработчика будет выведена информация, которая хранится в $_FILES. Переменную нужно написать полностью большими буквами. Язык PHP является регистрозависимым. Как вы сами можете убедиться, в этом массиве имеется множество полей. Все они важны для нас. В первом поле указано название файла в том виде, в котором оно будет использовано на вашем компьютере. В графе type указан тип файла. Имя временного файла соответствует полю tmp_name. Он будет удален после завершения работы скрипта. Код ошибки хранится в поле error. Об этом речь пойдет немного позже.В поле Size указывается размер в байтах.

Возможные ошибки

Загрузка файла, осуществляемая через PHP, всегда сопровождается кодом ошибки. В поле Error заключено сообщение об ошибке. Ошибка на скриншоте равна нулю. Давайте рассмотрим значения всех ошибок.

— 0 (UPLOAD_ERR_OK) – проблем нет, файл был успешно загружен;

— 1 (UPLOAD_ERR_INI_SIZE) – размер файла больше, чем было указано в upload_max_filesize;

— 3 (UPLOAD_ERR_PARTIAL)– файл загрузился частично;

— 4 (UPLOAD_ERR_NO_FILE) – файлнезагрузился.

Ранее уже говорилось о параметре, который можно было указать в обычном HTML. Приведем пример формы для загрузки файла, в которой указано ограничение по размеру загружаемого файла:

<form method= “POST”

action=”ссылканафайлобработчик”

enctype=”multipart/form-data”>

<! – размер указывается только в байтах>

<input type=”file” name=”file_upload” />

<input value=”Загрузитьфайл”type=”submit”/>

</form>

Скрипт для загрузки файла

Как же данная операция осуществляется на практике?

Загрузка файла в PHP осуществляется при использовании команды copy. Если вас интересует вопрос о том, как можно загрузить файл, то сделать это можно при использовании команды copy. В ней используется два параметра – файл исходный и файл назначения. Как уже было написано выше, нельзя ограничиваться этим в целях безопасности. Например, для начала можно проверить, что за файл мы загружаем. Сделать это можно при помощи поля typeв массиве $_FILES. Для начала давайте разберемся с процессом проверки. Предположим, вы хотите, чтобы у пользователей была возможность загружать фотографии с расширением PNG, JPEG, GIF. Указать это можно следующим образом:

If ($_FILES [‘file_upload’][‘type’]!=”imagegif”) {echo “Извините, поддерживается только загрузка файлов GIF”;}

Exit;

}

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

Копирование осуществляется следующим образом: copy (файл 1, файл 2). Если работа идет с загрузкой с компьютера на сервер, то необходимо прописать следующее:

copy ($_FILES [‘file_uplload’] [“tmp_name”], “1.jpg”)

Таким образом будет скопирован файл под названием 1.jpg.

Отблагодари меня, поделись ссылкой с друзьями в социальных сетях:


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *