Как прочитать заголовок файла, загруженного в PHP? - PullRequest
5 голосов
/ 09 декабря 2011

Можем ли мы прочитать информацию заголовка файла в PHP, чтобы определить тип загружаемого файла?.

Я не хочу полагаться на $_FILES['control_name_from_client']['type']. Поскольку мы знаем, что это свойство определяет тип файлапрочитав расширение загруженного файла.

Что если пользователь переименует, скажем test.jpg -> test.xls .В этом случае $_FILES['control_name_from_client']['type'] будет показывать тип как application / vnd.ms-excel вместо image / jpeg .Вполне естественно, что это может создать проблемы, если необходимо выполнить код, который читает файл XLS для извлечения данных для некоторой обработки.

Любые предложения, пожалуйста?

Ответы [ 4 ]

7 голосов
/ 09 декабря 2011

Попробуйте finfo_file(). Вы должны назвать это, передавая путь к файлу. Пример:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['control_name_from_client']['tmp_name']);
finfo_close($finfo);

Вам нужно расширение Fileinfo. Как сказано в руководстве по PHP:

Функции в этом модуле пытаются угадать тип содержимого и кодировку файла путем поиска определенных магических байтовых последовательностей в определенных позициях в файле. Хотя это не пуленепробиваемый подход, используемые эвристики делают очень хорошую работу.

2 голосов
/ 09 декабря 2011

Не знаю, о каком «заголовке» вы говорите, но с точки зрения безопасности единственное, на что вы действительно должны обратить внимание - это расширение файла .
Просто потому, что ваш веб-сервер будет судить ваш файл по нему.

Чтобы проверить, является ли загруженный файл действительными данными для какого-то конкретного приложения, вы должны использовать эту специальную подпрограмму, в PHP нет универсального инструмента. Вы можете использовать imagemagick для изображений, getid3 для mp3-файлов, fffmpeg для фильмов и т. д.

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

2 голосов
/ 09 декабря 2011

Раньше было расширение mime_magic в более старых версиях PHP, но сейчас оно устарело в пользу finfo_file , который использует сигнатуры файлов для проверки типа файла, а нерасширение.

2 голосов
/ 09 декабря 2011

Насколько я знаю, в PHP такой функции нет, но если у вас есть доступ к CLI (и вы работаете в Linux), вы можете использовать команду "file" через system ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...