A PHP Error was encountered

Severity: 8192

Message: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead.

Filename: mysql/mysql_driver.php

Line Number: 303

Загрузка файла на сервер с проверками для безопасной загрузки - PHP

Загрузка файла на сервер с проверками для безопасной загрузки - PHP

Автор: Mowshon.
Опубликовано 13 ноября 2011
в рубрике PHP, Примеры

Просмотров: 8635.
Подписаться на комментарии по RSS.

PHP-скрипт Загружаем файлы на сервер

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

Для чего используется данный скрипт?

- Профиль пользователя (загрузка собственной картинки - аватара)

- Баннерная реклама (Загрузка флеш или графического баннера)

- Онлайн фото галерея (Не будем же мы для очередной фотографии заходить по FTP, нужно автоматизировать процесс сделав загрузку изображении через админку)

- Офисная свалка (Загрузка отчетов или других важных документов формата: doc, pdf, djvu...)

Все сводится к одному и тому же - загрузка файла на сервер.

Какие файлы не нужно допускать к загрузке ?

Без вашего ведома не должны допускаться к загрузке файлы которые выполняют программный код.

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

Расширения которые не должны позволяться к загрузке со стороны обычного пользователя

php, cgi, pl, php3, php4, php5, php6, phps, phtml, shtml, py, exe

Как предотвратить выполнение скриптов если хакер смог загрузить файл?

Для этого нам понадобится помощь .htaccess он не позволит запуск скриптов расширение которых находится в списке запрещенных (1. Смотрим код ниже.) (2. Данный пример подходит для сайтов на Apache)

Теоретическая часть закончена, подходим к просмотру скриптов изнутри.

Иерархия файлов и папок данного скрипта

Файл upload.html - Содержит обыкновенную форму загрузки файла на сервер.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Загрузка файла на сервер - PHP</title>
</head>
<body>
    <h2 align='center'>Загрузка файла на сервер</h2>
    <form method="post" name="upload_form" action="upload.php" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="5242880" />
        <p align='center'>Максимальный размер файла: 5 мб.
<input name="uploaded_file" type="file"><input type="submit"></p>
    </form>
</body>
</html>
Обратите внимание на встроенную переменную MAX_FILE_SIZE, она указывает максимально допустимый размер загружаемого файла в байтах. Не стоит на ней рассчитывать, HTML форму можно легко подделать и отправить PHP скрипту файл который не прошел проверку со стороны браузера.

Файл upload.php берет на себя главную роль в загрузке файла на сервер.

<?php
/*
 * Загрузка файла на сервер
 * Автор: Mowshon (Live-code.ru)
 * Дата: 11.11.13
 */
// Максимально допустимый размер загружаемого файла - 5Мб
$MaxFileSizeInBytes = 5242880;
// Разрешение расширения файлов для загрузки
$AllowFileExtension = array('jpg', 'png', 'jpeg', 'gif', 'rar', 'zip', 'doc', 'pdf', 'djvu');
// Оригинальное название файла
$FileName = $_FILES['uploaded_file']['name'];
// Полный путь до временного файла
$TempName = $_FILES['uploaded_file']['tmp_name'];
// Папка где будут загружатся файлы
$UploadDir = "uploads/";
// Полный путь к новому файлу в папке сервера
$NewFilePatch = $UploadDir.$FileName;
if($FileName) {
    // Проверка если расширение файла находится в массиве доступных
    $FileExtension = pathinfo($FileName, PATHINFO_EXTENSION);
    if(!in_array($FileExtension, $AllowFileExtension)) {
        echo "Файлы с расширением {$FileExtension} не допускаются";
    }
     else {
         // Проверка размера файла
         if(filesize($TempName) > $MaxFileSizeInBytes) {
             echo "Размер загружаемого файла превышает 5МБ";
         }
          else {
              // Проверяем права доступа на папку
              if(!is_writable($UploadDir)) {
                  echo "Папка ".$UploadDir." не имеет прав на запись";
              }
               else {
                   // Копируем содержимое временного файла $TempName и создаем нового в папке сервера
                   $CopyFile = copy($TempName, $NewFilePatch);
                   if(!$CopyFile) {
                       echo "Возникла ошибка, файл не удалось загрузить!";
                   }
                    else {
                        echo "Файл успешно загружен!<br />Ссылка на файл: <a href='{$NewFilePatch}'>{$NewFilePatch}</a>";
                    }
               }
          }
     }
}
?>

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

Файл .htaccess из папки uploads запрещает выполнение файлов с определенным расширением.

<FilesMatch "\.(php|cgi|pl|php3|php4|php5|php6|phps|phtml|shtml|py)$">
Order allow,deny
Deny from all
</FilesMatch>
>> Скачать скрипт из статьи

Все появившейся вопросы задавайте в комментариях ниже. Буду рад объяснить все непонятные моменты. Благодарю за внимание!

Комментариев: 5

  1. Kostas | 26.12.2011 в 22:17:10 | #1

    Blagadarstvuyu!!!

  2. max | 26.12.2011 в 23:49:56 | #2

    Скрипт работает, спасибо.

  3. Mowshon | 27.12.2011 в 12:26:29 | #3

    Рад помочь wink

  4. anikey99 | 03.04.2012 в 09:33:59 | #4

    Доработал скрипт:

    1. Загружаемому файлу присваивается случайное имя

    2. Создается превьюшка для изображений

    Адрес: http://kachay.ucoz.org/forum/8-710-1

  5. FLS | 09.08.2012 в 17:29:12 | #5

    Я абсолютный нуль-PHP. Но вот решила создать сайт на хостинге с поддержкой PHP и БД, последнее, правда не хочу использовать, нашла cms на файлах.

    Очень прошу Вас как PHP-специалиста написать мне, модифицируя выложенное здесь, следующее:

    в процессе диалога с юзером у меня появляется ссылка на изображение с другого сервера (не с его локального компьютера, как это у Вас здесь, а с буржуйского сервера картинок jpg,png,gif). Я могу вызвать созданный Вами upload.php и

    передать ему эту ссылку. Каковы опции вызова upload.php?опция1=значение1&опция2=значение2 - это нужно уточнить, т.к. вызов будет не отправкой формы,

    файла upload.html мне не нужно, а с помощью JavaScript, обрабатывающего

    запрос юзера с получением адреса картинки. Новое имя и адрес загрузки

    может формировать и JS. Но можно оставить это в upload.php, только в случае

    успешной загрузки upload.php должен как-то сообщить в JS эти параметры,

    чтобы JS сценарий мог оперировать ими дальше, встраивая это изображение,

    предлагая юзеру его скачать и т.п.

    Кроме того, изображений может быть много и просьба встроить в upload.php

    сервис их удаления через заданное время, например, 24 часа.

    Все echo для юзера надо заменить информацией для JS - юзер этого диалога

    касаться не должен.

    О взаимодействии php и js пока представление имею смутное, но, например,

    диалог с юзером в моём index.php, в котором прописан сценарий JS

    и чего-нибудь скрытое display:none типа input,

    как только в индексе от JS получен адрес изображения, индекс обращается

    к upload.php - но не отправкой формы с перезагрузкой страницы, а

    как-то без перезагрузки и сообщает ему адрес изображения. upload.php

    дает ему имя, загружает его и в скрытое поле ввода сообщает либо false.

    либо true с именем и адресом новой картинки, JS на таймере SetInterval считывает value из скрытого поля ввода, как только там появилась запись,

    прекращает процесс отслеживания, считывает инфо, обнуляет value, работает

    дальше.

    Вобщем, что и как делать в сценарии JS я представляю отлично, но вот ни

    строчки php кода изобразить не могу. Если Вам не трудно, помогите,

    только переделайте файл upload.php , а JS я напишу, подстроившись под него.

    Заранее благодарю.

Оставьте комментарий!

Гость
Комментатор / хотите им стать

Чтобы стать комментатором введите email и пароль. Напишите комментарий. В дальшейшем ваша связка email-пароль, позволит вам комментировать и редактировать свои данные. Не забудьте про активацию (инструкция придет на ящик, указанный при регистрации).

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)