Как читать заголовок файла, загруженного на 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 для фильмов и т.д.

Но, конечно, весь файл должен быть использован, проверка только "заголовка" не гарантирует, что весь файл действителен.