Intereting Posts
Как получить доступ к «ключу» и «значению» из массива, переданного в цикл for? Почему мой PHP-код возвращает inf? HTML-формы. Как добавить несколько кнопок, которые передают разные значения? Как разобрать гетерогенную разметку с помощью PHP? Неустранимая ошибка HelperSet не найдена при настройке Doctrine Console (с помощью CodeIgniter) Замена PHP-образа? codeigniter site_model Тяжесть: обратите внимание на ошибку, которая не соответствует этой строке? Ошибка PHP Parse: синтаксическая ошибка, неожиданный T_PUBLIC Отображение массива в PHP с ключами Как вернуть массив из функции jQuery ajax success и использовать его в цикле? PDOException SQLSTATE Нет такого файла или каталога Неопределенное свойство: stdClass: использование AngularJS + PHP предотвращать кеш кнопки назад браузера Необходимо заменить слова в тексте специальными синонимами find () на модели дает id как строку в одной среде, а int в другой

является ли определение типа mime лучшим способом для обнаружения своего рода файла?

Я работаю над формой загрузки в 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, если бы это были фотографии.