Форма загрузки файлов на сервер с помощью php

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

Обработчиком формы загрузки файлов будет PHP.

HTML-код:

<form method="post" enctype="multipart/form-data">
    <p>Загрузить файл:</p>
    <p><input name="file" size="18" type="file" value=""></p>
    <p><input name="submit" type="submit" value="Загрузить"></p>
</form>

Код тривиально простой. Главное не забывать про указание enctype, потому что, как правило, из-за него и возникают проблемы. Второе, на что обращаю внимание, так это на то, что не прописан в форме action, то есть подразумевается, что html-код и php-код будут в одном файле. Всё что касается html-кода форм можно прочитать в статье - Форма обратной связи на PHP.

PHP-код:

<?php
$file = $_FILES['file']['tmp_name'];
$filename = $_FILES['file']['name'];
if(!empty($file))
{
  ini_set('memory_limit', '32M'); 
  $maxsize = "100000000";
  $extentions = array( "gif","txt","tpl","jpg","jpeg","png","zip", "rar","7z","tif","psd","swf","flv","avi","mpeg","mp4","mp3","wav", "ogg","ogm","doc","xls","ppt");
  $size = filesize ($_FILES['file']['tmp_name']); 
  $type = strtolower(substr($filename, 1+strrpos($filename,".")));
  $new_name = 'file-'.time().'.'.$type; 
  if($size > $maxsize)
  { 
     echo "Файл больше 100 мб. Уменьшите размер вашего файла или загрузите другой. <br><a href='' onClick=window.close();>Закрыть окно</a>";
  } 
  elseif(!in_array($type,$extentions)) 
  { 
    echo ' <b>Файл имеет недопустимое расширение</b>. Допустимыми являются форматы изображений, видеофайлов, флэш-роликов и текстовых документов. <br>';
  } 
  else 
  { 
    if (copy($file, "uploads/".$new_name))
      echo "Файл загружен!<br>Скопируйте адрес файла<br> <a href=\"uploads/$new_name\"><b>http://site.com/uploads/$new_name</b></a><br> и нажмите<br><a href='' onClick=history.back();>Вернуться назад</a>";
    else echo "Файл НЕ был загружен.";
  } 
}
?>

1 Строка 2. В переменную файл $file заключается имя временного файла, в который сохраняется загруженный файл.

2 Строка 3. В переменную $filename заключается исходное имя файла.

3 Строка 4. Проверка - если файл загружался, то будет выполнен весь ниженаписанный код.

4 Строка 6. Выделяем на процесс больше опертивки, потому что при загрузке больших файлов умолчаний может быть недостаточно. 32 метров должно хватить, если что, ставьте 64.

5 Строка 7. Максимальный размер файла в байтах в переменной $maxsize. Сейчас стоит 100Мб.

6 Строки 8-10. Список допустимых расширений для файлов. Переменная $extentions.

7 Строка 11. Определяем размер файла в переменной $size.

8 Строка 12. Определяем расширение файла в перемнной $type.

9 Строка 13. Задаём новое имя файла, если оно надо.

10 Строки 14-19. Проверка соответствия размера файла.

11 Строки 20-25. Проверка расширения файла

12 Строки 26-35. Выполняются, только если прошла проверка на расширение и размер файла. Здесь уже сохраняется файл, и результат сохранения будет сказан.

Не стоит забывать о… Три нюанса

Первое, о чём не стоит забывать, это о расширениях файлов.

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

Второй нюанс был найден методом проб и ошибок и связан вот с чем. Если файл html и файл обработчика разделить (например, на htmlcode.html и phpcode.php), то файл хтмл может находится вообще на любом сервере и в нём будет прописан путь к файлу php на другом сервере. То есть можно злоумышленничать при помощи того.

Ну а третий нюанс с защитой не связан. Просто помните про 6 строчку в коде, иногда нужна =).

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



[CODE] [/CODE]


Комментариев нет!