Я работаю над формой загрузки в php, которая должна допускать только mp3-файлы.
когда загрузка завершена, я анализирую файл, чтобы проверить, действительно ли это mp3 .. первым шагом является определение типа mime как «audio / mpeg», я использую библиотеки finfo_file () и прекрасно работает, за исключением того, что во время тестов некоторые mp3 отклоняются, потому что их тип mime возникает как: application / octet-stream
мои вопросы таковы: – должно ли мое приложение отказываться определенно от этих mp3? они на самом деле играют аудио – есть ли причина, почему этот тип mime является mp3? – является ли определение типа mime самым верным способом узнать тип файла?
В большинстве моих приложений, где требуется загрузка, я иногда соглашаюсь на проверку MIME, переданного браузером (клиентом), на список предопределенных типов MIME. Этот подход делает общее предположение, что если что-то подозрительное происходит там, где браузер не может передать тип MIME загружаемого файла, я, вероятно, не хочу его обрабатывать в это время.
<?php $valid_mp3_mimes = array( 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/x-mpeg-3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio', 'video/mpeg', 'video/x-mpeg', ); $uploaded_file_mime = $_FILES['upload_field_name']['type']; if(!in_array($uploaded_file_mime, $valid_mp3_mimes)) { die('Upload is not a valid MP3 file.'); }
Вы можете или не можете чувствовать, что это достаточный метод для ваших целей. В руководстве PHP прямо указано, что эта информация доступна, если браузер предоставил эту информацию и что тип MIME НЕ проверен на стороне сервера и поэтому не должен восприниматься как должное.
Необходимо учитывать наличие ресурсов на сервере, которые позволяют вам аутентифицировать истинный MIME-тип файла.
Как разработчики PHP, мы очень любим гибкость создания независимого от платформы кода (например, наши веб-приложения, созданные на системе Windows с запуском XAMPP, могут быть развернуты в среде хостинга Linux с минимальными изменениями). Однако при проверке типов MIME мы начинаем вводить зависящие от платформы методы, которые требуют проверки существования этих инструментов (таких как «файл» или «finfo_file»).
Это может быть одна реализация, заслуживающая изучения (взятая из репозитория CodeIgniter GitHub), которая использует эти инструменты и примерно так же тщательно описывает рабочий пример, как вы собираетесь получить в рамках PHP:
Тип файла MIME обнаруживает (фактический) тип MIME загруженного файла, если это возможно. https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983
источники
Загрузка PHP-метода POST-метода – http://www.php.net/manual/en/features.file-upload.post-method.php
Инструменты Mime для веб-мастеров – http://www.webmaster-toolkit.com/mime-types.shtml
Файл FILExt .MP3 – http://filext.com/file-extension/MP3
Если вы хотите чрезвычайно надежный способ обнаружения типов файлов, не доверяя клиенту для предоставления правильного типа MIME, используйте утилиту файлов в UNIX.
$ file Black\ Sands\ 01\ Prelude.mp3 Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo $ file homework/math475-hw8.docx homework/math475-hw8.docx: Microsoft Word 2007+
В PHP вы можете использовать функцию exec для ее вызова.
Лучший способ обнаружения файлов – использовать схему «магический байт» или «магический номер» в дополнение к MIME. file
Unix (а также finfo_file
) фактически использует «магические байты» для обнаружения этого файла. Итак, короче: да.
Не беспокойтесь о том, как выглядит ваш файл, и о том, что вы можете с ним сделать. Пока он играет, файл должен быть в порядке.
Если вы действительно хотите сделать больше, вы можете сами проверить магические байты. Здесь есть их список .
Я не знаю ответа на ваш вопрос, но я хочу предупредить вас. Вы можете легко создать файл, который вернет правильный тип mime, но в нем будет php-код. Я мог представить, что вы можете поместить PHP-код в пространство, где обычно будет отображаться информация об исполнителе, а затем иметь полностью действующий аудиофайл, который также будет запускаться как скрипт PHP.
Если вы не проверяете расширение файла, это позволит кому-то загружать аудиофайл с .php в качестве расширения. Очевидно, это позволит злоумышленнику перейти к файлу и объединить ваш сервер. Кроме того, даже если вы убедитесь, что у загрузок есть правильное расширение, они могут по-прежнему включаться, если ваш скрипт имеет уязвимость, где-то, или ваша загрузка может быть уязвима для обмана нисходящего потока.
Таким образом, храните содержимое файла в секретном месте, в вашей базе данных или gzip и вывешивайте их через другой файл, таким образом вы убедитесь, что ваш сервер не попытается выполнить файлы как PHP-скрипт. В противном случае найдите способ «переделать» их, как вы могли бы сделать с php_gd, если бы это были фотографии.