Similar presentations:
Загрузка файлов по протоколу HTTP
1. Лекция 1
Загрузка файлов по протоколу HTTP2. Загрузка файлов на сервер
Загрузка файлов на сервер осуществляетсяпользователями сети интернет довольно
часто:
• Веб-интерфейсы почтовых сервисов
• Интерактивные фотогалереи и
фотоальбомы
• Видеохостинги
• Файловые хостинги (файлообменники)
3. MIME
• MIME (произн. «майм», англ. Multipurpose InternetMail Extensions — многоцелевые расширения
интернет-почты) — спецификация для кодирования
информации и форматирования сообщений таким
образом, чтобы их можно было пересылать по
Интернету.
• Формат MIME поддерживает передачу нескольких
сущностей в пределах одного сообщения.
• Для обозначения множественного содержимого
используются медиатипы, обозначающие
составные типы данных: multipart/*.
4. Некоторые MIME-типы
Внутренний формат прикладной программы:• application/json: JavaScript Object Notation JSON
• application/javascript: JavaScript
• application/octet-stream: двоичный файл без
указания формата
• application/ogg: Ogg
• application/pdf: Portable Document Format, PDF
• application/postscript: PostScript
• application/xhtml+xml: XHTML
• application/zip: ZIP
• application/x-gzip: Gzip
5. Некоторые MIME-типы
Аудио:• audio/mp4: MP4
• audio/mpeg: MP3 или др. MPEG
• audio/ogg: Ogg Vorbis, Speex, Flac или др. аудио
• audio/vnd.wave: WAV
Видео:
• video/mpeg: MPEG-1
• video/mp4: MP4
• video/ogg: Ogg Theora или другое видео
• video/quicktime: QuickTime
• video/x-flv: FLV
6. Некоторые MIME-типы
Изображения:• image/gif: GIF
• image/jpeg: JPEG
• image/pjpeg: JPEG
• image/png: Portable Network Graphics
• image/svg+xml: SVG
• image/tiff: TIFF
7. Причины появления MIME
MIME расширяет функционал электроннойпочты (а впоследствии и протокола HTTP) для
поддержки:
• Текстовых данных в кодировках, отличных
от ASCII
• Не текстовых вложений
• Тел заголовков с множественным
содержимым
8. Множественное содержимое
• Множественное содержимое (MultipartContent) – наличие больше одного типа
данных в едином теле запроса.
• Перед каждой порцией содержимого обязан
быть разделитель (boundary),
представляющий собой случайный набор
символов латиницы.
• Наименование разделителя указывается в
заголовке Content-Type в основном заголовке
запроса.
9. Множественное содержимое
Subject: = Тема письмаContent-Type: multipart/mixed;
boundary="----==--bound.402108.web37j.yandex.ru"
------==--bound.402108.web37j.yandex.ru
Content-Transfer-Encoding: 8bit
Content-Type: text/html; charset=utf-8
<div>Текст письма в HTML</div>
------==--bound.402108.web37j.yandex.ru
Content-Disposition: attachment;
filename=“notation.svg"
Content-Transfer-Encoding: base64
Content-Type: image/svg+xml;
name="notation.svg"
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2Zy
B4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhs
aW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5…
10. Множественное содержимое
POST /send-message.html HTTP/1.1Host: webmail.example.com
Referer: http://webmail.example.com/sendmessage.html
User-Agent: BrowserForDummies/4.67b
Content-Type: multipart/form-data;
boundary=Asrf456BGe4h
Content-Length: (суммарный объём, включая
дочерние заголовки)
Connection: keep-alive
Keep-Alive: 300
(пустая строка)
(отсутствующая преамбула)
--Asrf456BGe4h
Content-Disposition: form-data; name="DestAddress"
(пустая строка)
[email protected]
--Asrf456BGe4h
Content-Disposition: form-data; name="MessageTitle"
(пустая строка)
Я негодую
--Asrf456BGe4h
Content-Disposition: form-data;
name="MessageText"
(пустая строка)
Привет, Василий! Твой ручной лев, которого
ты оставил у меня на прошлой неделе,
разодрал весь мой диван.
Пожалуйста забери его скорее!
Во вложении две фотки с последствиями.
--Asrf456BGe4h
Content-Disposition: form-data;
name="AttachedFile1"; filename="horror-photo1.jpg"
Content-Type: image/jpeg
(пустая строка)
(двоичное содержимое первой фотографии)
(отсутствующий эпилог - пустая строка)
11. Атрибут enctype у форм
• Определяет способ кодирования данныхформы при их отправке на сервер. Обычно
устанавливать значение атрибута enctype
не требуется. Однако если используется
поле для отправки файла (input type="file"),
следует определить атрибут enctype как
multipart/form-data.
12. Атрибут enctype у форм
• application/x-www-form-urlencoded– Вместо пробелов ставится +, символы в
нестандартных кодировках (например на
кириллице) кодируются их шестнадцатеричными
значениями (например, %D0%90%D0%BD%D1%8F
вместо Аня).
• multipart/form-data
– Данные не кодируются. Это значение применяется
при отправке файлов.
• text/plain
– Пробелы заменяются знаком +, буквы и другие
символы не кодируются.
13. Multipart-формы
• Загрузка файлов на сервер осуществляетсяс помощью multipart-формы, в которой есть
поле загрузки файла. В качестве атрибута
enctype указывается значение
multipart/form-data.
14. Поле для ввода файла
HTML-код поля для ввода имени файла,который будет загружен на Web-сервер
выглядит так:
• <input type="file" name="myFile">
В браузере будет отображаться так:
15. Общий вид формы загрузки файла
<form action="upload.php" method="POST"enctype="multipart/form-data">
<!—
Поле MAX_FILE_SIZE должно быть указано до поля загрузки
файла
-->
<input type="hidden" name="MAX_FILE_SIZE"
value="30000">
<!–
Название элемента input определяет имя в массиве $_FILES
-->
<input type="file" name="myFile">
<input type="submit" value="Загрузить">
</form>
16. Обработка файла на сервере
• PHP-интерпретатор, получив файл насервере, сохраняет его во временную
директорию (обычно /tmp, но зависит от
типа ОС и настроек PHP).
• Во временной директории файл хранится
под новым уникальным именем.
• После завершения работы скрипта,
временный файл будет удалён.
17. Индексы массива $_FILES[‘myFile’]
Для каждого файла в среде PHP создаётся глобальный массив$_FILES[имя_файлового_поля], в котором существует 5 индексов.
• $_FILES['myFile']['name'] - имя файла до его отправки на сервер,
например, pict.gif;
• $_FILES['myFile']['size'] - размер принятого файла в байтах;
• $_FILES['myFile']['type'] - MIME-тип принятого файла (если браузер
смог его определить), например: image/gif, image/png, image/jpeg,
text/html;
• $_FILES['myFile']['tmp_name'] - содержит имя файла во временном
каталоге, например: /tmp/phpV3b3qY;
• $_FILES['myFile']['error'] - Код ошибки, которая может возникнуть
при загрузке файла. Ключ ['error'] был добавлен в PHP 4.2.0. С
соответствующими кодами ошибок вы можете ознакомиться здесь.
18. Директивы конфигурационного файла php.ini
Директивы конфигурационногофайла php.ini
• file_uploads - Разрешать или не разрешать закачивание файлов;
• upload_tmp_dir string - Временная директория, используемая
для хранения файлов во время закачивания. Должна быть
доступна для записи пользователю, от имени которого запущен
PHP. Если не указана, используется директория по умолчанию
для вашей системы;
• upload_max_filesize - Максимальный размер закачиваемого
файла;
• max_file_uploads - Максимально разрешенное количество
одновременно закачиваемых файлов;
• post_max_size - Устанавливает максимально допустимый
размер данных, отправляемых методом POST. Это значение
также влияет на загрузку файлов. Для загрузки больших файлов
это значение должно быть больше значения директивы
upload_max_filesize;
19. Перемещение временного файла
bool move_uploaded_file(string $filename,string $destination)
• Функция проверяет, является ли файл
filename загруженным на сервер
(переданным по протоколу HTTP POST).
Если файл действительно загружен на
сервер, он будет перемещён в место,
указанное в аргументе destination.
20. Скрипт загрузки файла
<?php$uploadfile =
dirname(__FILE__).”/”.basename($_FILES['myFile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['myFile']['tmp_name'], $uploadfile)){
echo "Файл корректен и был успешно загружен.\n";
}
else{
echo "Возможная атака с помощью файловой загрузки!\n";
}
echo 'Некоторая отладочная информация:';
print_r($_FILES);
print "</pre>";
?>
21. Загрузка нескольких файлов
<form action="" method="post"enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Отправить" />
</p> </form>
22. Загрузка нескольких файлов
<?phpforeach
($_FILES["pictures"]["error"] as $key => $error)
{
if ($error == UPLOAD_ERR_OK)
{
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
23. Функции для работы с файлами
ФУНКЦИИ ДЛЯ РАБОТЫ СФАЙЛАМИ
24. Функция basename
string basename ( string $path [, string $suffix ] )• При передаче строки с путем к файлу или
каталогу, данная функция вернет
последний компонент имени из данного
пути.
• Если компонент имени заканчивается на
$suffix , то он также будет отброшен.
25. Функция basename
<?phpecho "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL;
echo "2) ".basename("/etc/passwd").PHP_EOL;
echo "3) ".basename("/etc/").PHP_EOL;
echo "4) ".basename(".").PHP_EOL;
echo "5) ".basename("/");
?>
Результат выполнения:
1) sudoers
2) passwd
3) etc
4) .
5)
26. Функция dirname
string dirname ( string $path )Получив строку, содержащую путь к файлу или
каталогу, функция возвратит родительский
каталог данного пути.
<?php
echo "1) " .
// 1) /etc
echo "2) " .
// 2) / (или
echo "3) " .
// 3) .
?>
dirname("/etc/passwd") . PHP_EOL;
dirname("/etc/") . PHP_EOL;
\ на Windows)
dirname(".");
27. Функция realpath
string realpath ( string $path )Раскрывает все символические ссылки,
переходы типа '/./', '/../' и лишние символы '/' в
пути path, возвращая канонизированный
абсолютный путь к файлу.
<?php
chdir('/var/www/');
echo realpath('./../../etc/passwd');
?>
Результат:
/etc/passwd
28. Функция unlink
bool unlink (string $filename [, resource $context])
Удаляет файл filename.
Возвращает TRUE в случае успешного завершения
или FALSE в случае возникновения ошибки.
29. Функции прав доступа, групп и владельцев
ФункцияНазначение
bool chown ( string $filename,
mixed $user)
Осуществляет попытку изменения
владельца файла с именем filename
на владельца, чье имя передано в
параметре user (в виде числа или
строки). Только суперпользователь
может изменять владельца файла.
bool chgrp ( string $filename,
mixed $group )
Осуществляет попытку смены
группы файла filename на группу
group.
bool chmod ( string $filename , Осуществляет попытку изменения
режима доступа указанного файла
int $mode )
на режим, переданный в
параметре mode.
30. Переменная $mode у функции chmod
<?phpchmod("/somedir/somefile", 755);
// десятичное, скорее всего, указано
неверно
chmod("/somedir/somefile", "u+rwx,
go+rx");
// строка, неверный способ
chmod("/somedir/somefile", 0755);
// восьмеричное, верный способ
?>
31. Функция opendir()
resource opendir ( string $path[, resource $context])
• Открывает дескриптор каталога для последующего
использования c
функциями closedir(), readdir() и rewinddir().
• Возвращает дескриптор каталога (resource) в случае
успеха или FALSE в случае ошибки.
32. Функция readdir()
string readdir ([ resource $dir_handle ] )• Возвращает имя следующего по порядку элемента
каталога. Элементы возвращаются в том порядке, в
котором они хранятся в файловой системе.
• Возвращает имя элемента каталога в случае успеха или
FALSE в случае возникновения ошибки.
• Эта функция может возвращать как boolean FALSE, так и
не-boolean значение, которое приводится к FALSE.
Используйте оператор === для проверки значения,
возвращаемого этой функцией.
33. Функция closedir()
void closedir ([ resource $dir_handle ] )• Закрывает поток, связанный с каталогом и переданный
в качестве параметра dir_handle. Перед
использованием данной функции, поток должен быть
открыт с помощью функции opendir().Возвращает имя
элемента каталога в случае успеха или FALSE в случае
возникновения ошибки.
34. Пример: открыть каталог, считать файлы
<?php$dir = "/etc/php5/";
// Открыть известный каталог и начать считывать его содержимое
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo "файл: " . $file;
echo " тип: ". filetype($dir . $file) . "\n";
}
closedir($dh);
}
}
?>
35. Результатом выполнения данного примера будет что-то подобное:
файл:файл:
файл:
файл:
файл:
. тип: dir
.. тип: dir
apache тип: dir
cgi тип: dir
cli тип: dir
36. Объяснение сообщений об ошибках
Объяснение сообщений об ошибках• PHP возвращает код ошибки наряду с
другими атрибутами принятого файла. Он
расположен в массиве, создаваемом PHP
при загрузке файла, и может быть получен
при обращении по ключу error. Другими
словами, код ошибки можно найти
в $_FILES['userfile']['error'].
37. UPLOAD_ERR_OK
• Значение: 0; Ошибок не возникло, файлбыл успешно загружен на сервер.
38. UPLOAD_ERR_INI_SIZE
• Значение: 1; Размер принятого файлапревысил максимально допустимый
размер, который задан
директивой upload_max_filesize конфигурац
ионного файла php.ini.
39. UPLOAD_ERR_FORM_SIZE
• Значение: 2; Размер загружаемого файлапревысил значение MAX_FILE_SIZE,
указанное в HTML-форме.
40. UPLOAD_ERR_PARTIAL
• Значение: 3; Загружаемый файл былполучен только частично.
41. UPLOAD_ERR_NO_FILE
• Значение: 4; Файл не был загружен.42. UPLOAD_ERR_NO_TMP_DIR
• Значение: 6; Отсутствует временная папка.Добавлено в PHP 5.0.3.
43. UPLOAD_ERR_CANT_WRITE
• Значение: 7; Не удалось записать файл надиск. Добавлено в PHP 5.1.0.
44. UPLOAD_ERR_EXTENSION
• Значение: 8; PHP-расширение остановилозагрузку файла. PHP не предоставляет
способа определить, какое расширение
остановило загрузку файла; в этом может
помочь просмотр списка загруженных
расширений с помощью phpinfo().
Добавлено в PHP 5.2.0.
45. Лабораторная работа
• 1. Написать скрипт, позволяющий загружатьнесколько файлов в текущую директорию
на сервере. Выбрать MIME-тип
содержимого и максимальный размер.
• 2. Создать скрипт для вывода файлов на
экран с возможностью удаления любого
файла.
• 3. Предусмотреть защиту от взлома.