Для текстовых файлов, таких как JavaScript, CSS и HTML, браузер попытается проанализировать файл. Если этот синтаксический анализ завершился неудачей до того, как что-либо может разобраться, то оно считается полностью недействительным. В противном случае, насколько это возможно, сохраняется и используется. Для JavaScript, вероятно, необходимо синтаксически скомпилировать все.
Для двоичных файлов, таких как файлы Flash, PNG, JPEG, WAVE, они могут использовать библиотеку, такую как magic library. Магическая библиотека определяет тип файла MIME с использованием содержимого файла, который действительно является единственной заслуживающей доверия.
Однако, когда вы перетаскиваете документ в своем браузере, эвристика браузера в этом случае должна проверять расширение файла. Действительно слабый! Таким образом, файл для присоединения к POST может быть .exe, и вы думаете, что это .png, потому что это текущее расширение файла ...
У меня есть код для тестирования MIME-типа файла в JavaScript (после перетаскивания или Browse ...):
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-проигрывателя, и у нас было обновление библиотеки GIF.
Обнаружение типа, как это делает волшебная библиотека, будет читать только «несколько» байтов в начале файла и определить тип, основанный на этом. Это не означает, что файл действителен и может быть безопасно загружен. Ошибка GIF означала, что файл очень похож на GIF-образ (у него была правильная подпись), но в какой-то момент буферы, используемые в библиотеке, могли бы переполняться, что могло бы создать способ свернуть ваш браузер и, надеюсь, для хакера, взять на себя ваш компьютер ...