Для текстовых файлов, таких как JavaScript, CSS и HTML, браузер попытается проанализировать файл. Если этот синтаксический анализ не выполняется до того, как что-либо может быть проанализировано, то он считается полностью недействительным. В противном случае, насколько это возможно, сохраняется и используется. Для JavaScript, вероятно, нужно синтаксически скомпилировать все.
Для двоичных файлов, таких как файлы Flash, PNG, JPEG, WAVE, они могут использовать библиотеку, такую как magic library . Волшебная библиотека определяет MIME-тип файла, используя содержимое файла, которое действительно является единственной надежной частью.
Однако, каким-то образом, когда вы перетаскиваете документ в вашем браузере, эвристика браузера в этом случае должна проверять расширение файла. Действительно слабый! Таким образом, файл для присоединения к POST может быть .exe, и вы можете подумать, что это .png, потому что это текущее расширение файла ...
У меня есть код для проверки MIME-типа файла в JavaScript (после перетаскивания или просмотра ...):
https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/plugins/output/output.js
Поиск MIME, и вы найдете различные функции, выполняющие работу. Пример использования виден в редакторе:
https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/plugins/editor/editor.js
Существуют расширения основных типов MIME, которые можно найти в плагине mimetype.
Это весь объектно-ориентированный код, поэтому поначалу может быть немного трудно следовать, но более или менее многие вызовы асинхронны.
Существует ли принятый метод определения того, что возвращается с веб-сервера? Заголовок Content-type обычно выглядит правильно. Расширения также являются показателем, но не всегда точным.
Насколько я знаю, Apache использует расширения файлов. Предполагая, что вы доверяете администратору своего сайта и конечные пользователи не могут загружать контент, расширения на самом деле довольно безопасны.
Является ли единственным точным методом проверки содержимого файла?
Точно и безопасно, да. При этом сервер, который использует систему базы данных, может сохранять такие метаданные в базе данных и, таким образом, не должен перепроверять каждый раз, когда обрабатывает файл. Кроме того, как только тип обнаружен, он может попытаться загрузить дважды проверить, что тип MIME все правильно. Это может даже произойти в бэкэнд-процессе, поэтому вы не тратите время клиента (на самом деле мой сервер идет дальше и проверяет каждый файл на наличие вирусов, поэтому даже файлы, которые он не может загрузить, проверяются каким-то образом).
Это то, что веб-браузеры делают, чтобы определить, как обрабатывать контент?
Как упоминал Джо Уайт, в большинстве случаев браузер ожидает определенный тип данных из файла: ссылка на CSS ожидает данные CSS; скрипт ожидает JavaScript, Ruby, ASP; тег изображения или рисунка ожидает изображение; и т.д.
Таким образом, браузер может использовать загрузчик для этого типа данных, и если загрузка не удалась, он знает, что это не тот тип. Таким образом, браузеру на самом деле не нужно определять тип как таковой. Однако вы должны верить, что загрузчики не будут работать правильно, когда поток данных будет недопустимым. Вот почему у нас есть обновления Flash Player, а еще недавно было обновление библиотеки GIF.
Обнаружение типа, как это делает волшебная библиотека, будет считывать только «несколько» байтов в начале файла и определять тип на основании этого. Это не означает, что файл является действительным и может быть безопасно загружен. Ошибка GIF означала, что файл очень похож на изображение GIF (у него была правильная подпись), но в какой-то момент буферы, используемые в библиотеке, переполнились бы, создавая возможность сбоя браузера и, как мы надеемся, взломщика ваш компьютер ...