вход

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

Загрузка файлов на сервер при помощи 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 готовых дизайнов. Шаблоны сайтов + установка + хостинг + персонализация + поисковая оптимизация + копирайтинг — все эти услуги вы всегда можете получить от профессионалов мирового уровня!


Нашли это полезным? Поделитесь с другими:
Не останавливайтесь, читайте дальше:
Оставить комментарий

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

Правила комментирования

  1. Кoммeнтapий всегда проходит премодерацию.
  2. В поле "URL блога" можно указывать только ссылку на главную страницу вашего блога. Ссылки на прочие веб-ресурсы (в том числе блоги/сплоги, созданные не для людей) будут удалены.
  3. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова. В случае несоблюдения этого условия имя изменяется по усмотрению владельца блога. Просьба указывать нормальное имя или ник.
  4. Весьма вероятно, что короткий и неинформативный кoммeнтapий вида "Спасибо!", "Интересная статья", будет удален. Исключение составляют знакомые автору блога комментаторы.