Что лучше проверять mime тип файла или его расширение или все вместе?
Есть форма загрузки файла, хочу сделать валидацию, что файл является определенного типа, что бы с ним дальше работать.
Что лучше проверять mime или расширение или все вместе?
Интуитивно понятно что лучше, но все же хочу узнать ваше мнения.
Спасибо!
Так как нельзя доверять любому вводу от пользователя, то по хорошему надо бы проверить не расширение и не mime (которые могут прийти любые), а собственно содержимое файла. Например - если вы ожидаете изображение jpeg - убедиться что у него есть соответствующие заголовки.
Почти всегда лучше проверять расширение, но если вдруг у вас проблемы с безопасность или самописный сервер/загрузчик/обработчик, то лучше проверять все вместе (через ленивую логику).
Griboks, нет, если вы хотите сразу послать на хрен все, кроме jpg и png, и следующим номером у вас идет проверка их содержимого - да, можно для начала и расширение проверить. Вот только jpg, jpeg и JPG - это три разных (и при этом валидных) расширения, хлопотно... и при этом таки ничего не гарантирует.
Adamos, омг. Что за ерунду вы пишите? Вы в своём уме? Фотоальбому нужна проверка формата фото? Да наплевать на все проверки. Пользователь загрузил неправильный форма - он просто не увидит фотографию и всё. Его проблемы. Никакая проверка тут не нужна. Максимум, как в ВКонтакте по расширению.
Griboks, ага, а если пользователь загрузил "правильный форма" - значит, все хорошо.
А то, что пользователь загрузил в файле с расширением JPG не картинку, а, например, PostScript-файл, который при попытке сервера изменить размер этой картинки успешно откроется, но заодно выполнит вредоносный код - это так, приятный бонус. Никакая проверка тут не нужна, все хорошо, ботнетам тоже надо кем-то кормиться.
Пруф: https://www.opennet.ru/opennews/art.shtml?num=50370
Adamos, смею вас заверить, что сайт - это ничто иное, как совокупность ответов от сервера. И навредить эти ответы могут только самому пользователю. Всё остальное зависит от сервера, и не думаю, что любой сервер с радостью запускает любой файл, полученный из любого источника.
Griboks, сайт - это нечто большее, чем ответы от сервера. Это еще и работа скриптов на самом сервере. Которые каким-то образом обрабатывают полученную информацию. Например, стандартными библиотеками, в которых есть известные уязвимости (пруф выше).
Эпоха "подоконных" вирусов, которые необходимо было запустить для заражения, уже практически закончилась.
KuzmenkoArtem, просто понятие расширения как признак типа файла - это только у win в наследство от dos
Более другие системы - ориентируются на содержимое.
Соответственно файл photo (без расширения) окажется вполне-таки файлом фотографии например с мака. И мало того, если пользователь его сохранил на флешку и аплоадид из-под винды - mime окажется совсем не image/jpeg
Но вот чтение нескольких байт из начала файла, где встретится "яШяа" - ответит на вопрос что это jpeg, a "GIF89a" - что gif
d-stream, Ну я с jpeg не собираюсь работать, у меня txt, csv, xml, json - оно все может оказаться text/plain
Получается что если в тексте есть запятые или угловые стрелочки это еще не признак того что это csv или xml
KuzmenkoArtem, для таких файлов тем более расширение будет неактуальным, а с учетом кодировок и text/plain - не факт...
Так что из первичного для xml - еще более-менее по контенту можно однозначно понять, ну и json - подобным образом... ну а txt|csv - тут разве что парсить и если вдруг процент ошибок не превышает порога - считать что "да, это оно и было"