Как читать заголовок файла, загруженного на PHP?
Можно ли прочитать информацию заголовка файла в PHP, чтобы определить тип загружаемого файла?.
Я не хочу полагаться на $_FILES['control_name_from_client']['type'].
Поскольку мы знаем, что это свойство определяет тип файла, прочитав расширение загруженного файла.
Что делать, если пользователь переименовывает, скажем test.jpg → test.xls. В этом случае $_FILES['control_name_from_client']['type']
будет показывать тип как application/vnd.ms-excel вместо image/jpeg. Естественно, это может создать проблемы, если необходимо выполнить код, который считывает файл XLS для извлечения данных для некоторой обработки.
Любые предложения, пожалуйста?
Ответы
Ответ 1
Попробуйте finfo_file()
. Вы должны называть это передачей пути к файлу. Пример:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['control_name_from_client']['tmp_name']);
finfo_close($finfo);
Вам нужно расширение Fileinfo
. Как написано в руководстве PHP:
Функции в этом модуле пытаются угадать тип содержимого и кодировку файла путем поиска определенных последовательностей байтов magic в определенных положениях файла. Хотя это не пуленепробиваемый подход, используемые эвристики делают очень хорошую работу.
Ответ 2
Насколько я знаю, такой функции нет в PHP, но если у вас есть доступ к CLI (и работает под Linux), вы можете использовать команду "file" через system().
Ответ 3
Раньше существовало расширение mime_magic в старых версиях PHP, но это устарело теперь в пользу finfo_file, который использует сигнатуры файлов для проверки типа файла, а не только расширения.
Ответ 4
Не знаю, что такое "заголовок", о котором вы говорите, но с точки зрения безопасности единственное, на что вы действительно должны обратить внимание, это расширение файла .
Просто потому, что ваш веб-сервер будет судить о вашем файле.
Чтобы проверить, являются ли загруженные файлы действительными данными для определенного приложения, вы должны использовать эту прикладную программу, в PHP нет универсального инструмента.
вы можете использовать imagemagick для изображений, getid3 для mp3 файлов, fffmpeg для фильмов и т.д.
Но, конечно, весь файл должен быть использован, проверка только "заголовка" не гарантирует, что весь файл действителен.