Я нашел несколько примеров в Интернете, но я хотел бы получить отзывы от людей, которые ежедневно используют PHP, относительно потенциальных соображений безопасности или производительности и их решений.
Обратите внимание, что меня интересует загрузка только одного файла за раз.
В идеале плагин для браузера не требуется (Flash / Java), хотя было бы интересно узнать о преимуществах использования плагина.
Я хотел бы знать как лучший код HTML-формы, так и код обработки PHP.






Основное преимущество Flash в том, что он позволяет загружать несколько файлов. Основное преимущество Java - это возможность перетаскивания из файловой системы. Извините за то, что не ответил на главный вопрос, но я подумал, что добавлю его, так как это довольно просто.
Вместо того, чтобы говорить о Java и Flash, было бы гораздо полезнее, если бы вы привели пример кода, который показывает, как будет отображаться индикатор выполнения с использованием PHP5;)
Ты можешь. phpclasses.org/blog/post/…
Вы может загружаете несколько файлов, используя функцию массива HTML, поддерживаемую PHP. руководство по php
Прочтите это введение, который расскажет вам все, что вам нужно знать. Комментарии пользователей тоже довольно полезны.
<form enctype = "multipart/form-data" action = "action.php" method = "POST">
<input type = "hidden" name = "MAX_FILE_SIZE" value = "1000000" />
<input name = "userfile" type = "file" />
<input type = "submit" value = "Go" />
</form>
action.php - это имя файла PHP, который будет обрабатывать загрузку (показано ниже)MAX_FILE_SIZE должен стоять непосредственно перед вводом с типом file. Этим значением можно легко манипулировать на клиенте, поэтому на него не следует полагаться. Его главное преимущество заключается в том, чтобы заранее предупредить пользователя о том, что его файл слишком велик, еще до того, как он его загрузит.file, но убедитесь, что оно не содержит пробелов. Вы также должны обновить соответствующее значение в файле PHP (ниже).<?php
$uploaddir = "/www/uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Success.\n";
} else {
echo "Failure.\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
Папка для загрузки не должна располагаться в месте, доступном по протоколу HTTP, в противном случае можно было бы загрузить сценарий PHP и выполнить его на сервере.
Печать значения $_FILES может дать намек на то, что происходит. Например:
Array
(
[userfile] => Array
(
[name] => Filename.ext
[type] =>
[tmp_name] =>
[error] => 2
[size] => 0
)
)
Эта структура дает некоторую информацию об имени файла, типе MIME, размере и коде ошибки.
0 Indicates that there was no errors and file has been uploaded successfully
1 Indicates that the file exceeds the maximum file size defined in php.ini. If you would like to change the maximum file size, you need to open your php.ini file, identify the line which reads: upload_max_filesize = 2M and change the value from 2M (2MB) to whatever you need
2 Indicates that the maximum file size defined manually, within an on page script has been exceeded
3 Indicates that file has only been uploaded partially
4 Indicates that the file hasn't been specified (empty file field)
5 Not defined yet
6 Indicates that there´s no temporary folder
7 Indicates that the file cannot be written to the disk
php.iniПри запуске этой установки с файлами большего размера могут возникать ошибки. Найдите в файле php.ini следующие ключи:
max_execution_time = 30upload_max_filesize = 2M
При необходимости может помочь увеличение этих значений. При использовании Apache для внесения изменений в этот файл требуется перезапуск.
Максимально допустимое значение памяти (установленное через memory_limit) здесь не играет роли, поскольку файл записывается в каталог tmp по мере его загрузки. Расположение каталога tmp необязательно контролируется через upload_tmp_dir.
Вы должны проверить тип файла того, что загружает пользователь - лучше всего сверяться со списком разрешенных типов файлов. Потенциальный риск разрешения любого файла заключается в том, что пользователь может загрузить код PHP на сервер, а затем запустить его.
Вы можете использовать очень полезное расширение fileinfo (которое заменяет старую функцию mime_content_type) для проверки mime-типов.
// FILEINFO_MIME set to return MIME types, will return string of info otherwise
$fileinfo = new finfo(FILEINFO_MIME);
$file = $fileinfo->file($_FILE['filename']);
$allowed_types = array('image/jpeg', 'image/png');
if (!in_array($file, $allowed_types))
{
die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue
Вы можете узнать больше об обработке загрузки файлов на Руководство PHP.net.
//For those who are using PHP 5.3, the code varies.
$fileinfo = new finfo(FILEINFO_MIME_TYPE);
$file = $fileinfo->file($_FILE['filename']['tmp_name']);
$allowed_types = array('image/jpeg', 'image/png');
if (!in_array($file, $allowed_types))
{
die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue
Вы можете узнать больше о FILEINFO_MIME_TYPE на Документация PHP.net.
Стоит отметить, что в этом примере я мог загрузить файл php и получить доступ к вашему веб-серверу. Будьте осторожны с этим. : S
Вы правы. Я опубликовал это как ответ сообщества, так что не стесняйтесь редактировать его самостоятельно :)
Да, важно проверять mimetype загружаемых файлов. Лучшая защита - разрешить определенные типы (изображение / JPEG, архив / zip и т. д.) И запретить все остальные.
@Ross: Звучит как хорошая идея. Можете ли вы продемонстрировать код для проверки типов MIME? Спасибо за ссылку, кстати.
Я использую расширение FileInfo для проверки типов MIME. Добавил в этот пост (как лучше) и немного изменил форматирование.
Хорошие обновления, Росс, спасибо. Я тоже научился у вас Markdown.
Безопасность - это довольно важная вещь в отношении загрузки файлов, добавление .htaccess в папку загрузок, которая останавливает запуск скриптов из нее, может быть удобным, чтобы добавить просто дополнительный уровень безопасности.
.htaccess
Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi
Ссылка: http://www.mysql-apache-php.com/fileupload-security.htm
Дополнительным преимуществом является то, что в PHP 4 вы не можете отображать индикатор выполнения загрузки. Вы можете использовать PHP 5, Flash и Java.