1. Загрузка файла
Чтобы пользователь клиента загружал файлы, мы должны предоставить форму в пользовательском интерфейсе для отправки запросов на загрузку файлов. Поскольку загруженный файл является специальным данным, в отличие от других данных POST, мы должны установить специальное кодирование для формы:
Скопируйте код следующим образом: <form action = "upload.php" method = "post" ectype = "Multipart/Form-Data"> </form>
Вы можете не быть знакомы с вышеуказанными атрибутами Enctype, потому что это часто игнорируется. Однако, если запрос POST HTTP содержит как обычные данные, так и файловые данные, следует добавлять этот атрибут, который может улучшить совместимость для различных браузеров.
Далее мы должны добавить поле в форму, чтобы загрузить файл:
Скопируйте код следующим образом: <input type = "file" name = "вложение">
Приведенные выше поля файла могут вести себя по -разному в различных браузерах. Для большинства браузеров приведенные выше поля приведены в текстовое поле с кнопкой просмотра. Таким образом, пользователь может ввести путь к файлу в текстовое поле самостоятельно или выбрать файл, который будет загружен с локального жесткого диска через кнопку просмотра. Однако в сафари Apple кажется, что можно использовать только просмотр. Конечно, вы также можете настроить стиль этой коробки для загрузки, чтобы она выглядела более элегантной, чем стиль по умолчанию.
Ниже, чтобы лучше объяснить, как обрабатывать загрузки файлов, приведите полный пример. Например, следующая форма позволяет пользователям загружать вложения на мой локальный сервер:
Скопируйте код следующим образом: <p> Пожалуйста, загрузите вложение: </p>
<form action = "upload.php" method = "post" ectype = "multipart/form-data">
<input type = "file" name = "вложение">
<input type = "Отправить" value = "upload atchatment">
</form>
Совет: вы можете установить максимальное значение, которое позволяет загружать файлы через upload_max_filesize в php.ini. Кроме того, существует также post_max_size, который можно использовать для установки максимальных данных, которые разрешены для загрузки. установив это поле. Тем не менее, обратите внимание, что значение последнего должно быть больше первого, потому что первое принадлежит к части данных формы последнего.
Рисунок 1. Загрузить форму, показанную в Firefox
Когда эта форма будет отправлена, HTTP -запрос будет отправлен на upload.php. Чтобы показать, какую конкретную информацию можно использовать в upload.php, я распечатал ее в upload.php:
Кода -копия выглядит следующим образом:
заголовок ('контент-тип: текст/Plain');
print_r ($ _ файлы);
Давайте проведем эксперимент.
Скопировать код следующим образом: массив
(
[вложение] => массив
(
[name] => boy.jpg
[type] => image/jpeg
[TMP_NAME] => D: /XAMPP/TMP/PHP1168.TMP
[ошибка] => 0
[размер] => 11490
)
)
Выше приведено вся информация о загруженном в настоящее время файл в глобальном массиве после загрузки файла. Тем не менее, можем ли мы гарантировать, что эта информация безопасна, что, если имя или другая информация была подделана? Мы всегда должны быть бдительными в отношении информации от клиентов!
Каждая часть конкретного HTTP -запроса
Чтобы лучше понять загрузку файлов, мы должны проверить, какую конкретную информацию содержится в HTTP -запросе, отправленном клиентом. Приложение, которое я загружал ранее, было логотипом этого блога, потому что это картина, для нас не подходит для проведения вышеуказанных экспериментов. Итак, я снова загрузил текстовый файл test.text, который содержит следующее содержимое:
Кода -копия выглядит следующим образом:
360 Вт
360 дней
Жизнь веб -мальчика
Хорошо. Теперь я загружаю этот текстовый файл и вывожу его в upload.php:
Кода -копия выглядит следующим образом:
Множество
(
[вложение] => массив
(
[name] => test.txt
[type] => текст/Plain
[TMP_NAME] => D: /XAMPP/TMP/PHP51C0.TMP
[ошибка] => 0
[размер] => 40
)
)
Давайте посмотрим на запрос HTTP POST, отправленный соответствующим браузером (я пропустил некоторые дополнительные заголовки):
Кода -копия выглядит следующим образом:
Post /upload.php http /1.1
Ведущий: www.360weboy.me
Реферат: http://www.360weboy.me/
Multipart/Form-Data; ------------------------------------------------------ -------------------------
Длина контента: 234
--------------------------------------- 24464570528145
Контент-дискуссия: Form-Data;
Тип контента: текст/равнина
360Weboy
360 дней
Жизнь веб -мальчика
-------------------------------- 24464570528145-
В формате вышеуказанного запроса есть несколько полей test.txt и загруженный формат файла Texat/plain (представляет текстовый файл). Затем мы видим, что следующая строка - это конкретный контент в загруженном файле.
2. Укрепление безопасности
Чтобы улучшить безопасность в загрузке файлов, нам нужно проверить TMP_NAME и размер в глобальном массиве $ _FILES. Чтобы убедиться, что файл, на который указан tmp_name, действительно является файл, загруженный пользователем на клиенту, а не на что -то вроде /etc /passwd, вы можете использовать функцию is_uploaded_file () в php, чтобы сделать следующее решение :
Кода -копия выглядит следующим образом:
$ filename = $ _files ['Attachment'] ['tmp_name'];
if (is_uploaded_file ($ filename)) {
/ * - загруженный файл.
}
В некоторых случаях, после того, как пользователь загружает файл, содержимое успешно загруженного файла может отображаться пользователю для просмотра, поэтому проверка вышеуказанного кода особенно важна.
Еще одна вещь, которую нужно проверить,-это тип MIME файла загрузки, который является полем типа выходного массива в вышеупомянутом upload.php. То, что я загрузил в первом примере, - это изображение, поэтому значение $ _files ['ATTHAMENT'] ['type'] является «Image/jpeg». Если вы планируете принять только изображения типа MIME, такие как Image/PNG, Image/JPEG, Image/GIF, Image/X-PNG и Image/P-JPEG на стороне сервера, вы можете использовать код, аналогичный следующему, чтобы проверить (Просто посмотрите на это) Примеры, конкретные коды, такие как ошибки, должны следовать механизмам в вашей системе):
Кода -копия выглядит следующим образом:
$ alluction_mimes = массив (
'Image/png',
'Image/x-png',
'изображение/GIF',
'Image/jpeg',
'Image/pjpeg'
);
$ image = $ _files ['Attachment'];
if (! in_array ($ image ['type'], $ alluct_mimes)) {
Die («Извините, формат файла, который вы загружены, неточен; мы принимаем только файлы изображений.»);
}
// продолжать обрабатывать загруженные файлы изображений
Как вы можете видеть, мы гарантировали, что тип MIME файла удовлетворяет требованиям на стороне сервера. Тем не менее, этого недостаточно, чтобы помешать вредоносным пользователям загружать другие вредные файлы, потому что вредоносные пользователи могут притворяться, что они замаскированы этим типом MIME. Например, пользователь сделал изображение JPG, написал несколько вредоносных PHP -кода в метаданные изображения и сохранил его в качестве файла с суффиксом с именем PHP. Когда этот вредоносной файл будет загружен, он будет успешно проверен на стороне сервера для типа MIME, который считается изображением, и будет выполняться опасный код PHP внутри. Метаданные конкретного изображения аналогичны следующему:
Кода -копия выглядит следующим образом:
Имя файла: image.jpg
Размер файла: 182007 байт
Дата файла: 2012: 11: 27 7:45:10
Резолюция: 1197 x 478
Комментарий: Passthru ($ _ Post ['cmd']);
Мы видим, что код PHP добавляется в поле комментариев метаданных изображения. Таким образом, очевидно, что для предотвращения подобных опасных ситуаций также необходимо провести необходимую проверку расширения загруженного файла. Следующий код улучшает предыдущий код для проверки типа MIME:
Кода -копия выглядит следующим образом:
$ alluction_mimes = массив (
'Image/png' => '.png',
'image/x-png' => '.png',
'Image/gif' => '.gif',
'Image/jpeg' => '.jpg',
'Image/pjpeg' => '.jpg'
);
$ image = $ _files ['Attachment'];
if (! array_key_exists ($ image ['type'], $ alluct_mimes)) {
Die («Извините, формат файла, который вы загружены, неточен; мы принимаем только файлы изображений.»);
}
// Получите имя файла с пропущенным именем суффикса:
$ filename = substr ($ image ['name'], 0, strpos ($ image ['name'], '.'));
// Добавить имя суффикса
$ filename. = $ alluct_mimes [$ image ['type']];
// продолжать обрабатывать загруженные файлы
Через приведенный выше код мы гарантируем, что даже если загруженная метафиль изображения содержит код PHP, файл изображения будет переименовано в файл с именем суффикса и форматом изображения, поэтому код PHP в нем не будет выполнен. Приведенный выше код не окажет негативного влияния на нормальные загруженные изображения.
После выполнения приведенных выше нескольких шагов для улучшения проверки безопасности, если вы просто хотите сохранить загруженный файл в указанный каталог, вы можете использовать функцию по умолчанию ove_uploaded_file PHP для его реализации:
Кода -копия выглядит следующим образом:
$ tmp_filename = $ _files ['atchatment'] ['tmp_name'];
$ filename = '/path/to/attachment.txt';
if (move_uploaded_file (tmp_filename, $ filename)) {
/ * $ temp_filename Файл загрузки, сохраненный во временном каталоге, а затем успешно сохранить его в файл ATTHAMENT.TXT в соответствующем каталоге.
}
Возможно, вам придется ограничить размер загруженного файла, поэтому вы можете использовать функцию размером с файлов, чтобы получить размер загруженного файла, сделать суждения и сделать дальнейшую обработку.
Хорошо, давайте на данный момент напишем это о загрузке файлов. Надеюсь, эта вступительная статья будет полезна для вас.