Загрузка файлов на сервер при помощи PHP


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

Загрузка файлов на сервервлечет за собой определенные риски. И вы должны понимать эти риски. Вы собираетесь позволить кому-то взять файл и расположить его на вашем сервере. Этот файл может быть чем угодно. Вы предполагаете, что это может быть изображение, но кто-то умный и вредный может задумать, что-то неладное и сделать попытку, чтобы загрузить вредоносный скрипт PHP, который может быть запущен при вызове соответствующего URL. Или пользователь может просто попытаться загружать файлы большего размера, чем тот, на который вы рассчитывали, и тратить память вашего сервера. Много всего можно ожидать, конечно, если вы собираетесь сделать загрузку файлов на сервер общедоступной.

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

Чтобы разрешить загрузку файлов, вы должны добавить enctype="multipart/form-data"к тегу формы (form). Это сигнализирует о том, что POSTзапрос будет содержать как значения полей формы, так и загрузку данных,.

Среди полей вам нужно создать скрытое полес именем MAX_FILE_SIZE, которое укажет, что клиент не может отправить файл больше определенного количество байт (300000, или 300килобайт, как в этом примере), а также само поле загрузки файлов.

<form method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="300000" />
<input type="file" id="myupload" name="myupload" />
<input type="submit" name="submit" value="Submit" />
</form>


 

Код, который обрабатывает загрузку файлов, на самом деле содержит всего пару строк. Остальные строки всего лишь проверка ошибок.

if ($_POST['submit']) { //если форма была отправлена

if ($_FILES['myupload']['error'] != 0) {
//Если загрузка не удалась по каким-либо причинам, то просто выводим понятные человеку сообщения об ошибке и соответствующий номер ошибки.
$errcode = array(
"Нет ошибки",
"Файл превысил значение upload_max_filesize, указанное в PHP.INI.",
"Файл превысил максимально допустимый размер.",
"Частичная загрузка.",
"Файл не загружен.",
"UPLOAD_ERR_NO_TMP_DIR",
"UPLOAD_ERR_CANT_WRITE",
"UPLOAD_ERR_EXTENSION",
"UPLOAD_ERR_EMPTY"
);
$error = $errcode[$_FILES['myupload']['error']];
echo "Error: " . $error;
}
else {
//Нет ошибок, так что мы можем поместить загруженный файл в наш каталог 
move_uploaded_file($_FILES['myupload']['tmp_name'], "./uploads/".$_FILES['myupload']['name']);
unset($_FILES);
}

}


 

Самая важная часть здесь, как видите, это функция move_uploaded_file (), которая размещает загружаемый файл в нашем каталоге. Первый аргумент это временный пункт загружаемого файла ($ _FILES ['myupload'] ['tmp_name']), а второй аргумент это пункт назначения.

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

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

  • Проверить тип MIME. Проверка загруженных файлов по типу MIMEпозволяет убедиться, что это файл нужного образа (изображение, документ).
  • Существование подстроки ". PHP"в имени файла.

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

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

$imgdata = getimagesize($_FILES['myupload']['tmp_name']);
if (!in_array($imgdata['mime'], array( 'image/gif', 'image/png', 'image/jpeg', 'image/pjpeg' ))) {
//Если это не файл изображения, то лучше показать ошибку и не перемещать изображение на его постоянное место. Временный файл будет удален автоматически.
}


 

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

if (strpos(strtolower($_FILES['ad_img']['name']), '.php') !== false) {
//Стоп здесь. Почему файл изображения имеет строку '.php'?
}


 

Этого вполне достаточно, чтобы препятствовать среднему детскому вредоносному сценарию, хотя кто-то опытный и мог бы найти способ, чтобы обойти такую проверку. Если у кого-то есть что добавить, я хотел бы услышать.

 

Реклама
Поделиться
Качественные премиум темы и шаблоны для Вашего сайта:

Смотреть полный каталог качественных тем и шаблонов

Здесь Вы можете выбрать из более чем 46 000 готовых дизайнов. Шаблоны сайтов + установка + хостинг + персонализация + поисковая оптимизация + копирайтинг — все эти услуги вы всегда можете получить от профессионалов мирового уровня!

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

18 − 15 =