Я нашел несколько образцов в Интернете, но я бы хотел получить обратную связь от людей, которые ежедневно используют PHP, в отношении потенциальных соображений безопасности или производительности и их решений.
Обратите внимание, что меня интересует только загрузка одного файла за раз.
В идеале не требуется плагин для браузера (Flash / Java), хотя было бы интересно узнать преимущества использования плагина.
Я хотел бы знать как лучший код HTML-кода, так и код обработки 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
может дать подсказку о том, что происходит. Например:
массив ( [userfile] => Массив ( [name] => Filename.ext [type] => [tmp_name] => [ошибка] => 2 [size] => 0 ) )
Эта структура дает некоторую информацию относительно имени файла, типа MIME, размера и кода ошибки.
0 Указывает, что ошибок не было и файл успешно загружен
1 Указывает, что файл превышает максимальный размер файла, определенный в php.ini. Если вы хотите изменить максимальный размер файла, вам нужно открыть файл php.ini, определить строку, которая читает: upload_max_filesize = 2M и изменить значение с 2M (2MB) на все, что вам нужно
2 Указывает, что максимальный размер файла, определенный вручную, внутри скрипта на странице превышен
3 Указывает, что файл был загружен частично
4 Указывает, что файл не указан (пустое поле файла)
5 Пока не определено
6 Указывает, что временная папка отсутствует
7 Указывает, что файл не может быть записан на диск
php.ini
При запуске этой установки с большими файлами могут возникать ошибки. Проверьте файл php.ini
для этих ключей:
max_execution_time = 30
upload_max_filesize = 2M
Увеличение этих значений по мере необходимости может помочь. При использовании Apache изменения в этом файле требуют перезагрузки.
Максимальное допустимое значение памяти (устанавливается через memory_limit
) здесь не играет роли, поскольку файл записывается в каталог tmp по мере его загрузки. Местоположение каталога tmp опционально управляется через upload_tmp_dir
.
Вы должны проверить тип файла того, что пользователь загружает. Лучше всего проверять список разрешенных типов файлов. Потенциальный риск разрешить любой файл заключается в том, что пользователь может потенциально загрузить PHP-код на сервер, а затем запустить его .
Вы можете использовать очень полезное расширение mime_content_type
(которое заменяет более mime_content_type
функцию 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 .
Прочитайте это введение, которое должно рассказать вам все, что вам нужно знать. Комментарии пользователей также весьма полезны.
Основное преимущество Flash – это возможность загрузки нескольких файлов. Основное преимущество Java – это возможность перетаскивания из файловой системы. Извините за то, что я не ответил на центральный вопрос, но я думал, что брошу это, поскольку это довольно просто.
Безопасность – довольно большая вещь в отношении загрузки файлов, добавление .htaccess в папку uploads, которая останавливает выполнение сценариев из нее, может быть полезна для добавления только дополнительного уровня безопасности.
.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