Проверка типа MIME бесполезна для загрузки файла? (в частности, используя API файлов Javascript)?

У меня есть сценарий сервера, получающий загруженный файл из Javascript.

Клиентская сторона, используя объект File (из файла API W3C ) и код, похожий на эту строку:

 if (file.type.indexOf("text") == 0) { ... } 

можно выполнить проверку типа файла. По-видимому, это использует тип MIME (который возвращает эти строки ).

В моих путешествиях здесь, через SO, я решился на этого достойного вкладчика , который утверждает, что типы MIME бесполезны.

Являются ли типы MIME действительно бесполезными в ситуации с загрузкой файлов, и поэтому проверка типов должна происходить на стороне сервера?

Вкладчик является правильным. Вы не можете полагаться только на проверку типа MIME, чтобы действительно проверить файл. Это полезно только для быстрого поиска. Например, на стороне клиента вы можете проверить тип файла MIME перед его отправкой на сервер, на случай, если пользователь выбрал неправильный тип файла, экономя время и пропускную способность. Извинения за либеральное использование запятых!

Этот вкладчик утверждает, что все проверки типа MIME бесполезны, клиент или сервер.

И в какой-то степени он прав. Проверка типа MIME всегда основана на обнюхивании определенных характеристик файла. Его пример: файл PDF должен начинаться с чего-то вроде %PDF-1.4 . Но файл, начинающийся с %PDF-1.4 , не обязательно является файлом PDF. (Упрощенное объяснение.)

Пользователь может поместить все правильные намеки во все нужные места, чтобы детектор MIME обнаружил файл как определенный тип, потому что он рассматривает эти конкретные подсказки. Но тогда остальная часть файла может быть чем-то совершенно другим. Если вы заходите так далеко, что же тогда делает файл определенного типа? Это всего лишь двоичный gobbledygook. В конечном итоге единственным способом убедиться, что файл является допустимым файлом типа X, является попытка открыть и проанализировать его с помощью синтаксического анализатора, который ожидает файлы типа X. Если он правильно анализирует, это файл полезен как тип X. Если он ходит как утка, трясины, как утка …

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