PHP Реальный [закрытый] тип файла

5
задан Jon Cram 9 July 2010 в 20:31
поделиться

5 ответов

1- Есть ли безопасный способ сделать это с помощью собственных функций php??

Для MP3-файлов, а не с собственными функциями PHP, нет.

Существует fileinfo , который использует функциональность ОС «MIME sniffing». Если он установлен, он обычно довольно надежен.

Кроме того, библиотека getID3 утверждает, что может извлекать информацию из файлов MP3. Если вы можете получить время воспроизведения из файла, скорее всего, это действительный файл MP3.

2- Тип файла, основанный на расширении, является проблемой php или связан с ОС?

Ни. Браузер определяет тип файла (обычно в соответствии с расширением) и отправляет тип MIME. Как и любые входящие данные, их очень легко подделать и им никогда нельзя доверять.

7
ответ дан 18 December 2019 в 13:10
поделиться

Вопрос о том, что такое MP3, немного мутный. Файлы MP3 обычно содержат кучу мусора в начале и/или конце, который не является действительными кадрами MP3. Обычно это делается для хранения тегов ID3, но нередко встречаются MP3 с бессмысленными данными в конце по другим причинам (например, наивное измельчение потока).

На практике почти все может быть MP3, и многие произвольные двоичные файлы будут содержать что-то, похожее на кадр MP3. Поиск информации ID3 и длины (как в ответе Пекки) является хорошим эвристическим подходом для получения представления о том, вероятно ли, что файл является MP3, но этого недостаточно, если вы имеете в виду безопасность.

он возвращает тип файла на основе расширения (я тестировал его только на windows)

На самом деле он возвращает строку типа, которую послал ему веб-браузер пользователя, которая на Windows определяется исходным расширением файла, а на Mac или Linux может быть получена из других источников. В любом случае, как и само имя файла, ему нельзя доверять. Компьютер пользователя может быть неправильно настроен или он может намеренно отправить неверную строку типа носителя для файла.

Существует безопасный способ сделать это с помощью встроенных функций php?

Каково ваше намерение использовать "безопасный"? Если ваша цель - остановить людей, загружающих файлы MP3, которые на самом деле являются другими типами файлов - обычно для целей внедрения HTML, Java или Flash содержимого для атак межсайтового скриптинга - тогда нет никакого реального способа сделать это. Вы можете создавать файлы, которые являются действительными MP3 и в то же время могут быть интерпретированы как другой тип. (См. атаки 'GIFAR'; то же самое возможно и с MP3.)

В итоге единственный подход, который надежно защищает вас от XSS-атак, - это предоставлять недоверенные загруженные пользователем файлы с другого хоста, не имеющего общего контекста безопасности с основным сайтом, так что межсайтовый скриптинг на нем ничего не дает. Частичное решение, которое вы также можете рассмотреть вместо или в качестве альтернативы, - предоставлять все файлы с заголовком Content-Disposition: attachment (если вам не нужно размещать изображения, которые будут отображаться в строке на странице).

3
ответ дан 18 December 2019 в 13:10
поделиться

Я бы проверил это:

http://getid3.sourceforge.net/

Вы можете использовать это, чтобы проверить, что это аудиофайл, и получить информацию о нем.

2
ответ дан 18 December 2019 в 13:10
поделиться

Вы хотите посмотреть на типы MIME. Расширение PHP fileinfo является предпочтительным способом сделать это.

1
ответ дан 18 December 2019 в 13:10
поделиться

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

1
ответ дан 18 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: