Upload файлов, и все с этим связанное PHP


Оглавление (нажмите, чтобы открыть):

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

09.06.2010, 12:36

загрузка файла на сервер с вашего сайта на чужой сервер под вашим логином!
Извените зараннее если ошибся разделом, не нашел куда можно отнести данную тему и посчитал как.

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

Загрузка файла на сервер
Ребят выручайте проблема с загрузкой файла на сервер. Проблема в размере файла. Php же ограничивает.

Загрузка файла на сервер!
Доброго времени суток ув.программисты!! Такие дела, написал скрипт, который грузит файл на сервер.

Загрузка файла на сервер
Народ я в php вобще новичок, создал сервер http://nfots.zz.mu/ и пробую загрузить туда файл с.

09.06.2010, 12:49 2

Добавлено через 1 минуту
Для формы обязательно указывать атрибут enctype=»multipart/form-data» — без него работать не будет.

Добавлено через 1 минуту
Если владеете английским, почитайте.

09.06.2010, 12:52 3 09.06.2010, 13:00 [ТС] 4

max_file_uploads что-то вообще не ищется

Добавлено через 2 минуты

09.06.2010, 13:00
09.06.2010, 13:01 5

Загрузка файлов на сервер

Здесь будет рассмотрена загрузка файлов на сервер по протоколу HTTP. Рассмотрим два варианта конфигурации PHP:
register_globals=On — все параметры передаваемые скрипту, автоматически становятся глобальными переменными.
register_globals=Off — параметры передаваемые скрипту заносятся в массивы $_GET, $_POST, $_FILES, $_COOKIE, .
Upload файлов при register_globals=On

Напишем HTML форму для отправки файла на сервер.

Содержание формы (файл upload.html):

После того как пользователь выбрал имя файла и нажал кнопку Загрузить , PHP помещает загружаемый файл во временную директорию указанную в параметре upload_tmp_dir файла php.ini. В этой директории этот файл будет храниться только во время запроса! После запроса PHP удалит этот временный файл. Поэтому загружаемый файл нужно куда-нибудь переместить (если он вам понадобиться в дальнейшем). Явно удалить временный файл можно функцией unlink(string filename) .

Здесь рассмотрим загрузку текстового файла и вывод его содержимого.

$myfile — имя временного файла, в котором находятся загруженные данные;

Когда пользователь отправляет форму, PHP автоматически определяет ещё несколько переменных:

$myfile_name — имя файла на компьютере компьютере пользователя;

$myfile_type — MIME-тип файла.

$myfile_size — размер файла в байтах.

При загрузке текстовых файлов переменная $myfile_type = «text/plain», при загрузке изображения gif переменная $myfile_type = «image/gif».

При register_globals=On можно пользоваться массивом $_FILES[].
Upload файлов при register_globals=Off

В этом случае PHP формирует массив $_FILES[]. В этом массиве храниться вся информация о всех загружаемых файлах. В нашем случае структура этого массива следующая:

$_FILES[«myfile»][«tmp_name»] — Имя временного файла
$_FILES[«myfile»][«name»] — Имя файла на компьютере пользователя
$_FILES[«myfile»][«size»] — Размер файла в байтах
$_FILES[«myfile»][«type»] — MIME-тип файла
$_FILES[«myfile»][«error»] — код ошибки.

PHP код для обработки формы:

При загрузке можно проверять размер файла ($myfile_size) и если его размер превышает требуемый, то вывод файла не производить.

0 — ошибок не было, файл загружен.
1 — размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini
2 — размер загруженного файла превышает размер установленный параметром MAX_FILE_SIZE в HTML форме.
3 — загружена только часть файла
4 — файл не был загружен (Пользователь в форме указал неверный путь к файлу).

Если вам необходимо сохранить загруженный файл, то это можно сделать с помощью функций:
copy ( string source, string dest);
move_uploaded_file ( string filename, string destination);

Функция copy() копирует файл source в место назначения dest .

Функция move_uploaded_file() перемещает загруженный файл filename в место назначение указанное в параметре destination .

Ещё хочется отметить что при одновременной загрузке нескольких файлов т.е. когда HTML форма содержит:

массив $_FILES[] будет иметь следующую структуру:

$_FILES[«myfile1»][«tmp_name»] — Имя временного файла 1
$_FILES[«myfile1»][«name»] — Имя файла на компьютере пользователя 1
$_FILES[«myfile1»][«size»] — Размер файла 1 в байтах
$_FILES[«myfile1»][«type»] — MIME-тип файла 1
$_FILES[«myfile1»][«error»] — код ошибки для файла 1.

$_FILES[«myfile2»][«tmp_name»] — Имя временного файла 2
$_FILES[«myfile2»][«name»] — Имя файла на компьютере пользователя 2
$_FILES[«myfile2»][«size»] — Размер файла 2 в байтах
$_FILES[«myfile2»][«type»] — MIME-тип файла 2
$_FILES[«myfile2»][«error»] — код ошибки для файла 2.

$_FILES[«myfile3»][«tmp_name»] — Имя временного файла 3
$_FILES[«myfile3»][«name»] — Имя файла на компьютере пользователя 3
$_FILES[«myfile3»][«size»] — Размер файла 3 в байтах
$_FILES[«myfile3»][«type»] — MIME-тип файла 3
$_FILES[«myfile3»][«error»] — код ошибки для файла 3.

это пример для одновременной загрузки трёх файлов.


Таким же образом можно загружать и двоичные файлы, например файлы картинок gif, jpeg и т.д.

Блог Александра Денисюка

В этой статье подробно разберём механизм загрузки изображений на сервер с помощью PHP не прибегая к сторонним компонентам и фреймворкам. Научимся безопасно загружать изображения не только с локальной машины пользователя, но и удалённые файлы по ссылке. Все примеры кода я буду писать в процедурном стиле, дабы вы быстрее могли читать код, а не перескакивать с одного метода на другой. Руководство полностью авторское и не претендует на какую-либо академичность изложения.

§1. Общие принципы

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

Для валидации картинки по URL мы будем использовать функцию getimagesizefromstring(), т. к. cURL скачает её в переменную для дальнейших манипуляций.

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

§2. Правила безопасности

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

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

§3. Конфигурация php.ini

PHP позволяет внести определённые конфигурационные значения в процесс загрузки любых файлов. Для этого необходимо в файле php.ini найти блоки «Resource Limits», «Data Handling» и «File Uploads», а затем отредактировать, по необходимости, следующие значения:

Исходя из указанных значений, пользователь не сможет за один раз загрузить больше десяти файлов, причём каждый файл не должен превышать 5 Мбайт. Параметры из блока «Resource Limits» больше нужны для загрузки удалённого файла, т. к. с помощью cURL мы будем скачивать содержимое в переменную и проверять её по нужным нам критериям, а для этого необходимо дополнительное время и память.

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

§4. Загрузка картинок из формы

Сейчас мы не будем рассматривать загрузку нескольких файлов на сервер, а разберём лишь саму механику загрузки на примере одного файла. Итак, для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить файл PHP-скрипту методом POST и указать способ кодирования данных enctype=»multipart/form-data» (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов). С формой ниже мы будем работать дальше:

Для поля выбора файла мы используем имя name=»upload» в нашей HTML-форме, хотя оно может быть любым. После отправки файла PHP-скрипту file-handler.php его можно перехватить с помощью суперглобальной переменной $_FILES[‘upload’] с таким же именем, которая в массиве содержит информацию о файле:

Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘upload’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file(). Если что-то идёт не по плану, значит выводим ошибку на экран.

Для того, чтобы злоумышленник не загрузил вредоносный код встроенный в изображение, нельзя доверять функции getimagesize(), которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo. Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize(), которой скормим сам бинарный файл $_FILES[‘upload’][‘tmp_name’]. В результате мы получим массив максимум из 7 элементов:

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

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

На этом загрузка изображения завершена. Для более удобной загрузки файлов можете использовать класс UploadedFile из пакета Symfony HttpFoundation, который является обёрткой для $_FILES и также сохраняет файл через move_uploaded_file().

§5. Загрузка изображения по ссылке

Для загрузки изображения по ссылке нам понадобиться библиотека cURL, которая работает с удалёнными ресурсами. С помощью неё мы скачаем контент в переменную. С одной стороны может показаться, что для этих целей подойдёт file_get_contents(), но на самом деле мы не сможем контролировать объём скачиваемых данных и нормально обрабатывать все возникшие ошибки. Для того, чтобы cURL корректно скачал данные нам нужно: разрешить следовать перенаправлениям, включить проверку сертификата, указать максимальное время работы cURL (формируется за счёт объёма скачиваемых данных и средней скорости работы с ресурсом). Как правильно скачать файл в переменную показано ниже с необходимыми параметрами:

Если всё прошло успешно и cURL уложился в 60 секунд, тогда содержимое по ссылке будет скачано в переменную $raw. Кроме того, функция curl_getinfo() вернёт информацию о проделанном запросе, откуда мы можем получить дополнительную информацию для анализа работы с удалёнными ресурсами:

Дальше нам нужно проверить нет ли ошибок в curl_errno() и удостовериться, что ресурс отдаёт равный 200, иначе мы скажем, что по такому-то URL ничего не найдено. После всех проверок переменную $raw передаём в getimagesizefromstring() и работаем уже по отработанной схеме как в случае с загрузкой картинок из формы.

Для сохранения изображения на диск можно воспользоваться file_put_contents(), которая запишет контент в файл. Новое имя файла мы создадим через функцию md5(), а расширение сделаем из image_type_to_extension(). Теперь мы можем загружать любые картинки по ссылке.

§6. Настройка выбора нескольких файлов

В этом параграфе разберём способы загрузки нескольких изображений за один раз с локальной машины пользователя и по удалённым ссылкам. Для отправки ссылок мы задействуем $_POST и передадим ей все данные с помощью тега textarea. Для загрузки файлов из формы мы продолжим дальше работать с $_FILES. Наша новая HTML-форма будет немного отличаться от старой.

В конец имени поля выбора файла name=»upload[]» добавились фигурные скобки и аттрибут multiple, который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES, но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

Для загрузки нескольких картинок по URL передадим наши ссылки через textarea с именем name=»upload», где их можно указать через пробел или с новой строки. Функция preg_split разберёт все данные из $_POST[‘upload’] и сформирует массив, по которому нужно пройтись циклом и каждый валидный URL отправить в обработчик.

Вы можете улучшить форму для загрузки изображений, например, воспользоваться библиотекой FineUploader или jQuery FileUpload, чтобы настроить выбор картинок с определённым расширением.

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

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

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

Для этого нам понадобится html форма с полем ввода типа . Кроме того, для передачи файлов на сервер необходимо форме установить тип multipart. Для этого в качестве параметра enctype указывается значение multipart/form-data.

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

После того, как пользователь выберет нужный файл и нажмет кнопку «Загрузить» форма передаст данные php скрипту на сервер, который указан в action формы. Если action формы пустой, то данные будут переданы тому же файлу, на котором находится форма. Вся информация о загружаемом файле помещается в массив $ _FILES. Нам лишь остается извлечь эту информацию и переместить файл в необходимое нам место.

Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini, чтобы разрешить загрузку файлов на сервер.

Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:

  • file_uploads = On — разрешает загрузку файлов на сервер по протоколу HTTP;
  • upoad_tmp_dir = /tmp — устанавливает каталог для временного хранения загруженных файлов;
  • upload_max_filesize = 2M — устанавливает максимальный объем загружаемых файлов.


Итак, создайте новый файл с именем upload.php и скопируйте в него следующий код.

Если внимательно посмотреть на форму, то Вы увидите скрытое поле

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

После того как пользователь выбрал файл и нажал на кнопку «Загрузить», вся информация о файле, как упоминалось ранее, помещается в массив $ _FILES, а сам файл помещается во временный каталог на сервере, который указан в в php.ini.

Так как поле file называлось name=»uploadFile», то массив $ _FILES будет содержать ассоциативный массив с ключом «uploadFile».

  • $_FILES[‘ uploadFile ‘][‘name’] — имя файла до его отправки на сервер, например, pict.gif;
  • $_FILES[‘ uploadFile ‘][‘size’] — размер принятого файла в байтах;
  • $_FILES[‘ uploadFile ‘][‘type’] — MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
  • $_FILES[‘ uploadFile ‘][‘tmp_name’] — содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY;
  • $_FILES[‘ uploadFile ‘][‘error’] — Код ошибки, которая может возникнуть при загрузке файла.

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

Итак, с алгоритмом разобрались! Теперь давайте взглянем на код.

Первым делом мы проверяем была ли нажата кнопка submit.

Если кнопка submit была нажата, то дальше мы проверяем был ли файл загружен через HTTP POST:

Если файл был загружен через HTTP POST, то далее мы его перемещаем из временного каталога в нужный нам каталог. Это делается при помощи функции move_uploaded_file, которая принимает два параметра: имя файла для загрузки и путь куда будет перемещен файл. В случае успешного перемещения файла, данная функция возвратит true, в противном случае –false.

В нашем случае в качестве имени файла выступает имя временного файла на сервере — $_FILES[‘uploadFile’][‘tmp_name’], а в качестве каталога, куда будет перемещен файл – переменная $uploadedFile, которая было объявлена выше в скрипте и содержит новое место хранения файла.

Из своего опыта могу сказать, что хранить оригинальное название файла на сервере не стоит, поэтому его можно переименовать. Для этого сгенерируем случайное название для нашего файла и функция move_uploaded_file() переместит и переименует наш файл:

Ну и напоследок приведу список возможных ошибок, которые возникают во время загрузки файлов на сервер. Напоминаю, что код ошибки хранится в переменной $_FILES[‘ uploadFile ‘][‘error’]:

  • 0- Ошибок не возникало, файл был успешно загружен на сервер.
  • 1- Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini..
  • 2- Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
  • 3- Загружаемый файл был получен только частично.
  • 4- Файл не был загружен.
  • 6- Нет временную папку.
  • 7- Сбой при записи файлов на диск.
  • 8- Загрузка файла остановлена.

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

При помощи нашего скритпа злоумышленник сможет загружать произвольные файлы на сервер, к примеру, он сможет закачать на сервер php-скрипт, который рекурсивно сможет удалить все ваши файлы на сервере или PHP-shell, так что если вы пишите свой загрузчик файлов, то к этому делу надо подойти серьезно, ничего не упустив.

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

Загрузка файла(ов) на сервер из формы средствами PHP

Сегодня загрузка файлов является практически неотъемлемым атрибутом современного web приложения. В данной статье речь пойдёт о том, как же загрузить файл(ы) на сервер с помощью PHP.

Навигация по статье:

Настройка php.ini

Конфигурационный файл php.ini необходимо настраивать согласно бизнес-логики проекта! Например, мы планируем загружать не более десяти файлов до 2 Мбайт, а это значит нам понадобиться

Загрузка одного файла на сервер из формы

Для начала разберём механизм загрузки одной картинки на сервер. Для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить нужный (выбранный) файл PHP-скрипту upload.php методом POST и указать способ кодирования данных enctype=»multipart/form-data» (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов).

После отправки файла PHP-скрипту upload.php его можно перехватить с помощью суперглобальной переменной $_FILES с таким же именем, которая в массиве содержит информацию о файле (в нашем случае image ):

Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘image’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file() . Если что-то идёт не по плану, значит выводим ошибку на экран:

Для того, чтобы «редиска» не загрузил вредоносный код, встроенный в изображение, нельзя доверять функции getimagesize() , которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo . Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

Таким образом, при необходимости, делаем проверку и на другие MIME-типы. Например, для zip архивов проверка будет такая:

На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize() , которой отдадим сам бинарный файл $_FILES[‘image’][‘tmp_name’] . В результате мы получим массив из элементов:

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

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

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

Генерация имени для картинки теперь будет такой:

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

Загрузка нескольких файлов на сервер из формы

Разберём механизм загрузки нескольких изображений за один раз с локальной машины пользователя. Продолжим дальше работать с $_FILES . Наша новая HTML-форма будет немного отличаться от старой.

Как видно в конец имени поля выбора файла name=»images[]» добавились фигурные скобки и атрибут multiple , который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES , но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

Мы реализовали механизм загрузки нескольких файлов на сервер. Весь код целиком лежит здесь .

Загрузка файлов на сайт: PHP, AJAX, HTML5 и Drag’n’Drop


Скучные формы загрузки — прошлый век. HTML5 дает возможности, чтобы добавить Drag’n’Drop, а AJAX позволяет загружать файлы без обновления страницы.

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

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

Эксплуатация уязвимостей в функциях для работы с файлами в PHP

Содержание статьи

PHP предоставляет богатые возможности для работы с файлами. Любой веб-программист сталкивался с функциями fopen, copy, filegetcontents и т. д. Однако далеко не каждый знает о таких довольно эффективных конструкциях, как фильтры и потоки, в которых совсем недавно обнаружились крайне серьезные баги.

bit.ly/tTtvWV — пример использования класса Lightning-Template.

bit.ly/mdrdqf — статья, подробно рассказывающая об уязвимости File path injection.

pastebin.com/1edSuSVN — пример использования уязвимости File path injection.

bit.ly/g6ztD3 — описание уязвимости, связанной с неправильной обработкой ключей в массиве $_FILES.

СТАНДАРТНЫЕ ФИЛЬТРЫ

Прежде чем приступать к описанию новых векторов атак, хочу немного рассказать о фильтрах и потоках, которые появились еще в PHP 4.3 и предоставили скриптам абстрактный слой для доступа к файлам. Различные ресурсы в PHP (сетевые соединения, протоколы сжатия и т. д.) могут рассматриваться как «потоки» данных. Можно последовательно считывать информацию из таких потоков или записывать ее в них. При этом существует ряд зарегистрированных в PHP фильтров, с помощью которых можно модифицировать данные, получаемые из потока. Для того чтобы получить список имеющихся в твоей системе фильтров, достаточно выполнить такой код:

Сампописный фильтр в девелоперской версии форума phpBB3

Хакер #156. Взлом XML Encryption

Чтобы использовать фильтр, его нужно связать с потоком. Это делается с помощью функции stream_filter_append/stream_filter_prepend или же с помощью враппера php://filter . Первый способ предоставляет больше возможностей для работы с фильтрами, но второй более компактен, что тоже обеспечивает определенные преимущества. Вот один пример использования фильтров для кодирования строки:

А вот пример однострочного скрипта, который получает данные методом POST, кодирует их в Base64 и выводит обратно:

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

Враппер php://filter также применяется и для обеспечения безопасности веб-приложений. Например, скрипт

при настройке «allowurlinclude = Off» не позволит злоумышленнику провести атаку RFI. Однако этот скрипт вполне позволяет прочитать локальные PHP-файлы — для этого достаточно послать уязвимому сценарию следующий POST-запрос: inc=php://filter/read%3Dconvert.base64-encode/resource%3D/ path/script.php

Хотя встроенные фильтры предоставляют впечатляющие возможности для решения самых разнообразных задач, разработчики PHP пошли дальше и позволили веб-программистам создавать собственные фильтры. И вот это уже интереснее всего!

ПИШЕМ СВОЙ ФИЛЬТР

О создании пользовательских фильтров написано мало и отрывочно, некоторые функции, необходимые для этого, очень скудно документированы. Тем не менее веб-приложения с такими фильтрами существуют. Предположим, что нам необходимо обрабатывать потоки с помощью функции nl2br. Для этого мы и напишем свой фильтр. Я не буду приводить код полностью, поясню лишь основные моменты метода filter (полный код ищи на нашем диске).

Итак, для начала нам нужно считать данные из потока. В дальнейшем мы будем обрабатывать их с сохранением во внутренней переменной «$this->_data»:

Когда мы прочитаем все данные из потока, параметр $closing примет значение TRUE. Теперь можно их обрабатывать:

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

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

Первый пример самописного фильтра

ПОЛЬЗОВАТЕЛЬСКИЕ ФИЛЬТРЫ

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

  1. $in — точка входа, ресурс, из которого поступают данные как по «цепочке людей, передающих ведро».
  2. $out — точка выхода, ресурс, в который отдаются обработанные данные.
  3. $consumed — место, где хранится длина данных, полученных фильтром, этот параметр всегда должен передаваться по ссылке.
  4. $closing — булева переменная, регулирующая получение данных, принимает значение TRUE, если считывание данных из входящего потока закончено.

Также метод filter должен возвращать одну из следующих трех констант:

  1. PSFSPASSON — данные успешно обработаны и переданы в точку выхода.
  2. PSFSFEEDME — ошибки отсутствуют, но данных для передачи в $out нет.
  3. PSFSERRFATAL (default) — произошла ошибка.

Методы onCreate/onClose применяют редко, но лучше включать их в код фильтра. Если фильтр оперирует другими ресурсами (например, буфером), то это указывается в методе onCreate, вызываемом при инициализации фильтра. Метод onCreate должен возвращать FALSE в случае неудачи и TRUE в случае успеха. Метод onClose вызывается при завершении работы фильтра (обычно во время закрытия потока). Чтобы наш фильтр был доступен, необходимо зарегистрировать его в системе с помощью функции streamfilterregister.

ПРИВЕТ ИЗ ЯПОНИИ

Теперь, когда мы научились создавать собственные фильтры, посмотрим, как они применяются в реально существующих скриптах. Воспользуемся для этого сервисом Google Code Search. Будем искать примеры использования функции streamfilterregister. При этом нам должен встретиться довольно интересный класс Lightning-Template (ссылки на сам класс и страницу разработчика ищи в сносках), который мы рассмотрим чуть подробнее. Допустим, у нас есть некий абстрактный шаблон sample.html:

сгенерит следующую HTML-страницу:

Пример использования класса Lightning Template

Таким образом, упомянутый класс по заданным шаблонам генерит соответствующий HTML-код. Хотелось бы сразу отметить, что подключение темплейтов в этом классе происходит через уже знакомую тебе конструкцию include, однако это не самое лучшее решение. Определенные группы пользователей обладают правами на редактирование темплейтов, что позволяет внедрять в них зловредный PHP-код, который успешно выполняется согласно логике данного класса. Самописный фильтр, идущий вместе с классом, как раз и делает всю основную работу по преобразованию HTML-кода. Внесем небольшие изменения в этот фильтр:

В строке, начинающейся с «‘ , я удалил одинарные кавычки. Это не влияет на функциональность фильтра, но дает нам новые возможности. Изменив фильтр, я добился того, чтобы произвольные команды исполнялись с помощью preg_replace с модификатором «e». Таким образом, если в темплейте есть строка:

— то при её обработке выполнится PHP-код. Важно отметить, что фильтры можно использовать с любыми функциями, поддерживающими потоки. Например, рассмотрим следующий скрипт:


Вспоминаем, что один враппер можно подставить в другой. Поэтому наши команды будут успешно выполняться для следующего POST-параметра file:

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

FILE UPLOAD

Обычно для загрузки файлов на сервер используют либо функцию moveuploadedfile, либо функцию copy. Довольно часто пользователям разрешается загружать графические изображения, картинки, аватары и т. д. При этом разработчики предусматривают разнообразные процедуры проверки загружаемых файлов, чтобы вместо картинки никто не загрузил полноценный веб-шелл. Чтобы понять, какая проверка действительно эффективна, а какую легко можно обойти, рассмотрим процесс обычной загрузки файла в подробностях.

Итак, для отправки пользовательского файла используется HTML-форма, например такая:

Когда мы выбираем файл для загрузки у себя на компьютере и нажимаем кнопку Upload, удаленному серверу отправляется POST-запрос, в котором обязательно содержится хедер Content-Type следующего вида:

А сами POST-данные имеют такой вид:

Как несложно догадаться, при заполнении формы мы выбрали файл hello.txt, который содержит « » . Когда PHP-скрипт на удаленном сервере получает этот запрос, интерпретатор PHP создает на сервере временный файл с именем типа phpseUm44, в который и попадает содержимое hello.txt. Этот временный файл хранится до завершения работы скрипта, а потом автоматически удаляется (подробнее о временных файлах в PHP читай в предыдущем номере нашего журнала). Также создается массив $_FILES следующего вида:

Тут важно понимать, что $_FILES[uploadfile][type] совпадает с элементом Content-Type, который формируется на стороне клиента. Обычно браузер автоматически заполняет этот элемент в зависимости от выбранного файла, поэтому некоторые веб-мастера, наивно надеясь обезопасить себя от загрузки зловредных PHP-скриптов, проводят только вот такую простенькую проверку:

При этом они забывают, что любой элемент пользовательского запроса можно легко изменить, то есть обойти такого рода фильтр очень просто. Для проверки также довольно часто используется функция getimagesize(). Конечно, это более эффективно, но не стоит забывать, что пользователь с легкостью может изменить EXIF-теги изображения, поэтому такой фильтр также легко можно обойти. Остается открытым вопрос о том, в каком виде файл сохраняется на сервере. Например, в зависимости от настроек веб-сервера файл pic.php.myext вполне может быть обработан как PHP-скрипт. Таким образом, безопасный аплоад файлов — это не только проверки в скриптах, но и грамотно решенный вопрос о местонахождении и обработке загруженных файлов. При этом также не стоит забывать и об особенностях самого PHP, связанных с массивом $_FILES.

УЯЗВИМОСТИ ЗАГРУЗКИ ФАЙЛОВ

Первая уязвимость, о которой я бы хотел рассказать, — это недостаточная обработка имени файла при его загрузке. Эта уязвимость помечена на сайте bugs.php.net как приватная, тем не менее если постараться, все-таки можно найти ее описание. �� Баг заключается в том, что если имя файла начинается со слеша или бэкслеша и больше слешей/бэкслешей не содержит, то оно проходит как есть в элемент массива $_FILES[uploadfile][name] . Таким образом, вместо того чтобы загрузить файл в текущую директорию скрипта, мы загрузим его в корневую директорию веб-сервера. На машинах под управлением Unix-подобных систем мы не сможем ничего загрузить в корневую папку из-за нехватки прав. Но вот на Windows-машинах вполне можно провернуть такой финт ушами. По ссылке в сносках ищи обучающее видео из блога первооткрывателя этого бага.

Вторая уязвимость более существенна. Она обусловлена неправильной обработкой ключей в массиве $_FILES. Впервые о ней я узнал от человека под ником Qwazar с форума rdot.org. Вместе с BlackFan, еще одним камрадом с этого форума, они провели тесты, раскрывающие суть этого бага. С их разрешения я расскажу о нем более подробно. Итак, пусть у нас есть мультифайловая загрузка, реализуемая с помощью функции copy:

Это позволяет не только загружать файлы, но и читать произвольный контент с сервера! Если мы отсылаем файлы на сервер при помощи вот такой вот формы:

— то в массиве $_FILES создаются элементы следующего типа:

Функция copy вполне успешно воспринимает эти элементы:

Таким образом, мы получаем возможность для манипулирования произвольными параметрами в $_FILES (ниже я покажу, что такое поведение характерно не только для функции copy). Приведу простой пример, чтобы более детально разъяснить суть уязвимости. Если на удаленном сервере имеется вышеуказанный скрипт (назовем его upload.php), а у нас на компьютере есть соответствующая HTML-форма, то для чтения исходника скрипта secret.php, который находится в той же директории, что и upload.php, нам необходимо и достаточно создать у себя на жестком диске два файла: 1. Файл с именем secret.php, содержимое которого не столь важно (пусть, к примеру, это будет « » ). 2. Файл с совсем простым именем, допустим «1». Его содержимое будет состоять из одного символа «1».

В качестве имени второго файла выбрано число, чтобы он смог пройти следующую проверку:

Теперь открываем вышеуказанную форму в браузере и в поле «file[tmp_name][» выбираем файл secret.php, а в остальных полях — файл с именем «1». Затем жмем на сабмит и видим, что в той же директории появился файл test.txt. Он представляет собой точную копию файла secret.php, но имеет расширение txt, и значит, мы легко можем просмотреть его в браузере.

Кстати, чтобы просмотреть файл из произвольной директории, нужно изменить поле Content-Type (то, о котором я говорил выше). В этом поле мы можем указать путь к любому файлу на сервере, и этот файл успешно скопируется в test.txt. Но и это еще не все!

«БЕЗОПАСНАЯ» ЗАГРУЗКА ФАЙЛОВ НА СЕРВЕР

Как отмечено выше, в основном загрузка файлов осуществляется с помощью функций moveuploadedfile и copy. Однако существуют и другие варианты для выполнения этой сложной и ответственной задачи. Один из таких вариантов (он, кстати, более предпочтителен, если речь идет о загрузке только изображений) — использование функций imagecreatefrom/image. Так как эти функции работают только с изображениями, то ничего, кроме картинки, мы им подсунуть не сможем. Например, скрипт

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

Итак, главная особенность функций imagecreatefrom* заключается в том, что они не только работают с графическими файлами, но и вполне себе поддерживают описанные выше потоки! Это открывает, к примеру, прекрасную возможность хранить картинки не на сервере, а в базе данных. Таким образом, если пропустить картинку через base64_encode и сохранить в БД, то потом такое изображение можно будет вывести на экран, например, вот так:

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

Предположим, что у нас есть веб-приложение, которое имеет описанный выше уязвимый фильтр, а также осуществляет мультифайловую загрузку, но не с помощью функции copy, а с помощью функции imagecreatefrom/image, например такой:

Создаем на сервере файл 1.jpg c произвольным содержимым, выбираем его во всех полях формы, которую я приводил выше, и отсылаем POST-запрос с модифицированным полем Content-Type:

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

«Приватная» уязвимость PHP

НОВАЯ ЖИЗНЬ СТАРЫХ БАГОВ

В конце 2009 года в PHP уже был найден похожий баг, связанный с неразберихой в ключах глобальных массивов. По задумке разработчиков, в именах GPC-переменных не должны содержаться символы « » (пробела), «.» и «[» (они могут интерпретироваться как элементы специального синтаксиса массивов). Однако версии PHP того времени допускали нарушение логики в образовании таких имен. Чтобы воспроизвести баг, набросаем специальную HTML-форму:

Также напишем скрипт index.php для вывода результата на экран:

Как видишь, логика в построении массива явно нарушена. Очень похожее нарушение логики лежит и в основе уязвимости в $_FILES, описанной в статье.

ВМЕСТО ЗАКЛЮЧЕНИЯ

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

PHP — загрузка файла

Дата публикации: 2020-10-18

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

Информацияна странице phpinfo.php описывает временный каталог, который используется для загрузки файлов, например upload_tmp_dir, а максимальный размер файлов, которые могут быть загружены, указывается как upload_max_filesize. Эти параметры задаются в файле конфигурации PHP php.ini. Процесс загрузки файла выполняется следующим образом:

Пользователь открывает страницу, содержащую HTML-форму с текстовыми файлами, кнопкой Обзор и кнопкой Отправить.

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

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

Как создать сайт самому?


Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Выбранный файл отправляется во временный каталог на сервере.

PHP-скрипт, который был указан в качестве обработчика формы в атрибуте формы action, проверяет, доставлен ли файл, а затем копирует этот файл в целевую директорию.

Скрипт PHP подтверждает успешное завершение действия.

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

Создание формы загрузки

Приведенный ниже HTML-код создает форму для загрузки. В этой форме для атрибута method задано значение post, а для атрибута enctype — multipart / form-data.

Upload файлов. Загрузка файлов на сервер. PHP

В этом уроке мы с Вами поговорим о загрузке файлов на сервер с помощью возможностей php.

Мы рассмотрим несколько вариантов загрузки файлов на сервер.

Мы также рассмотрим проверку верного формата файла — то есть, если у Вас сайт с музыкой, то и форматы должны быть типа *.mp3, *.mp4, *.ogg, *.wma и т.д.

И если пользователь захочет загрузить файл с неверным форматом, то мы ему этого не позволим.

И так для начала нам потребуется форма для загрузки файла на сервер.

В нашей форме появится одно новое поле, которое до этого мы не рассматривали — это поле file.

Прописывается оно следующим образом:

И так наша форма будет такой:

Имя нашего поля с файлом — upfile.

Для загрузки файла на сервер нужно сначала разобраться с директорией, в каторую Вы будете загружать файлы.

У этой директории должны быть выставлены соответствующие права доступа ( chmod ) — 777

Для изменения прав доступа можно воспользоваться Total Commander.

В нём выделите нужную папку и в меню файл ( вроде так — первое меню ) выберите изменить атрибуты и в них проставьте все галочки.

Теперь Ваша директория готова к загрузке файлов.

Ещё один момент с вопросом по директориям:

Если Вы будете тестировать скрипт на локальном сервере apache, который Вы поставили через denwer, то путь к папке будет таким — /home/SiteName/www/uploadfiles/

А если Вы будете использовать этот скрипт в интернете, то просто пишите путь к Вашей папке, где будут храниться файлы, что-то вроде этого — /files/uploadfiles/

И самое важное — в пути к директории в конце всегда ставьте знак слеша — / — так php сможет определить что это директория.

Теперь перейдём к самому скрипту закачки файла на сервер:

Вся информация о файле, который будет загружать пользователь, хранится в супер-глобальном массиве $_FILES.

В нём есть несколько значений — для обозначения имени файла возьмём имя — upfile:

1) $_FILES[«upfile»][«name»] — имя файла на компьютере пользователя — то есть, если пользователь загружал mymusic.mp3 — то имя — mymusic.mp3

2) $_FILES[«upfile»][«tmp_name»] — полный путь к временому файлу на диске, в котором

3) $_FILES[«upfile»][«size»] — размер файла в байтах

4) $_FILES[«upfile»][«type»] — mime/type файла, например у нас файл — hello.jpg, то его mime/type — image/gif

5) $_FILES[«upfile»][«error»] — код ошибки, работает с версии 4.2.0, если файл загружен успешно, то значение равняется 0

Теперь применим все эти значения массива в скрипте:

Пошаговое объяснения работы скрипта:

1) Проверяем размер файла — если он превышает допустимый, то выдаём сообщение о ошибке

2) При помощи функции — is_uploaded_file — проверяем загрузился ли файл во временную директорию

3) Если нет, то выдаём сообщение о ошибке

4) Если да, то при помощи функции — move_uploaded_file — перемещаем файл из временной директории в директорию для наших файлов

5) Если успешно загружен, то выдаём соответствующее сообщение, иначе сообщение о ошибке

Теперь поговорим о функциях использованных в этом коде:


Функции is_uploaded_file в качестве значений передаётся полный путь к временной директории, и если эта функция находит этот файл во временной директории, то она возвращает true, то есть файл скопирован.

Функции move_uploaded_file в качестве значений передаются путь к директории с временным файлом ( и именем файла ), и путь к директории, где хранятся остальные файлы ( с именем файла на компьютере пользователя, для загрузки файла на сервер именно с этим именем ).

Если при проверке этого скрипта на сервере — происходит ошибка, то советуем посмотреть файл php.ini

В нём можно настроить несколько параметров для работы скрипта:

1) file_uploads — Этот параметр может запретить или разрешить загрузку файлов на сервер с помощью php — по умолчанию у него значение равняется On, если нет, то исправьте на On

2) upload_max_filesize — Этот параметр обозначает максимальный размер загружаемого файла. По умолчанию его значение равняется 2М

3) post_max_size — Этот параметр нужен для загрузки нескольких файлов одновременно — по умолчанию 8М

4) upload_tmp_dir — Этот параметр обозначает временную директорию на сервере, куда будут сохранятся временные файлы

Давайте рассмотрим загрузку нескольких файлов на сервер одновременно:

Для этого достаточно прописать несколько полей с типом file, и с одинаковыми именами, после которых стоят квадратные скобки — [], будет что-то вроде таких имён — upfiles[]

И конечно изменим код нашего скрипта — в котором в цикле просто нужно после всех значений глобального массива $_FILES в квадратных скобках дописать номер загружаемого файла. А так как эти номера начинаются с 0, то и если три поля, то номера будут идти до 2.

И так вот код с описанием:

Все функции die () мы заменили на echo, так как все файлы должны будут попытаться загрузиться на сервер, и если первый файл не сможет, то цикл не остановиться, а продолжит загружать остальные файлы.

Также не стоит упускать момент с именем файлов.

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

Для устранения этой ошибки — Вы можете перевести имя файла в транслит.

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

Ну а теперь поговорим о форматах файлов.

Для проверки формата файла — мы создадим массив. Пускай мы хотим загружать только изображения, то для форматов возьмём такой массив — $filetype = array ( ‘jpg’, ‘gif’, ‘png’, ‘jpeg’, ‘bmp’ );

Теперь при помощи функции substr мы сможем занести в переменную тип файла. Для этого воспользуемся оригинальным именем файла — $_FILES[«upfile»][«name»].

Тогда обрезание строки будет таким — $upfiletype = substr( $_FILES[‘upfile’][‘name’], strrpos( $_FILES[‘userfile’][‘name’], «.» ) + 1 );

Почему мы приписали + 1 — потому что обрезаем всё по «.», а точка нам не нужна.

И после мы просто проверяем есть ли тип файла в массиве при помощи функции in_array

Пример загрузки файлов на сервер (upload) на языке php

Приложение для загрузки файлов на сервер представляет собой HTML-форму (upload.html) и скрипт upload.php для ее обработки.

Замечание: Upload бинарных файлов (картинок, архивов, программ и т.д.) стандартным методом часто приводит к тому, что файлы оказываются «битыми». Это связано с любовью Апача к всевозможным перекодировкам. Для того, чтоб он этим не занимался, допишите в файл httpd.conf следующее:

Код формы (upload.html)

Код скрипта обработки формы (upload.php)

Атрибут entype формы определяет вид кодировки, которую браузер применяет к параметрам формы. Для того чтобы отправка файлов на сервер действовала, атрибуту entype необходимо присвоить значение multipart/form-data. По умолчанию этот атрибут имеет значение application/x-www-form-urlencoded.

Элемент ввода этой формы должен иметь тип file.

После того, как получен HTTP-запрос, содержимое загруженного файла записывается во временный файл, который создается в каталоге сервера, заданном по умолчанию для временных файлов, если другой каталог не задан в файле php.ini (директива upload_tmp_dir).

Характеристики загруженного файла доступны через двумерный массив HTTP_POST_FILES.

Cкрипт upload.php загружает файл на сервер и копирует его в каталог /temp/. Внимание! В демонстрационном примере файл загружается на диск С в директорию /temp. Поэтому в реальной работе на сервере замените путь c:/temp на тот, который нужен.

После выполнения этого скрипта выбранный для загрузки файл будет помещен в каталог c:/temp, а броузер выдаст фразу: Файл успешно загружен

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

Максимальный размер загружаемого файла можно также задать при помощи директивы upload_max_filesize, значение которой по умолчанию равно 2 Мбайт:

PHP и взаимодействие с файловой системой Web-сервера

Введение

В статье рассмотрены вопросы организации загрузки файлов на сервер с помощью PHP, работы с каталогами и файлами на сервере, запуск программ и использование переменных среды. Все это становится актуальным при необходимости решения задач, связанных с изменением Web-содержимого или предоставления дружественного интерфейса пользователю вместо традиционного ftp или scp.

Также мы рассмотрим создание HTML-формы для интерфейса, реализующего функционал загрузки файлов на сервер.

Код HTML-формы

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

Для посылки данных используется метод POST. Дескриптор

Мастер Йода рекомендует:  Используем Python для извлечения фона из Super Mario Bros
Добавить комментарий