Как правильно определить тип файла, возвращаемого веб-сервером? - PullRequest
0 голосов
/ 07 сентября 2010

Я всегда считал, что HTTP Content-Type должен правильно идентифицировать содержимое возвращаемых ресурсов.Недавно я обратил внимание на ресурс от google.com с именем файла, похожим на /extern_chrome/799678fbd1a8a52d.js, который содержит заголовки HTTP:

HTTP/1.1 200 OK
Expires: Mon, 05 Sep 2011 00:00:00 GMT
Last-Modified: Mon, 07 Sep 2009 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Date: Tue, 07 Sep 2010 04:30:09 GMT
Server: gws
Cache-Control: private, x-gzip-ok=""
X-XSS-Protection: 1; mode=block
Content-Length: 19933

Содержимое не является HTML, но является чистым JavaScript.Когда я загружаю ресурс, используя локальный прокси (Burp Suite), прокси-сервер заявляет, что тип MIME - «скрипт».

Существует ли принятый метод определения того, что возвращается с веб-сервера?Заголовок Content-type обычно выглядит правильно.Расширения также являются показателем, но не всегда точным.Является ли единственный точный метод для проверки содержимого файла?Это то, что веб-браузеры делают, чтобы определить, как обрабатывать контент?

Ответы [ 3 ]

1 голос
/ 07 сентября 2010

Браузер знает, что это JavaScript, потому что он достиг его через тег <script src="...">.

Если вы ввели URL-адрес файла .js в адресную строку вашего URL-адреса, то даже если сервер вернул правильный тип содержимого, ваш браузер не будет воспринимать файл как выполняемый JavaScript. (Вместо этого вы, вероятно, либо увидите исходный код .js в окне браузера, либо вам будет предложено сохранить его в виде файла, в зависимости от вашего браузера.)

Браузеры ничего не делают с JavaScript, если на него не ссылается тег <script>, простой и понятный. Никакого отслеживания содержимого не требуется.

1 голос
/ 07 сентября 2010

Является ли единственным точным методом проверки содержимого файла?

Это метод, который браузеры используют для определения типа файла, но он ни в коем случае не является точным. Тот факт, что это не точно, является проблемой безопасности .

Единственный доступный серверу способ указать тип файла - через HTTP-заголовок Content-Type. К сожалению, в прошлом не так много серверов устанавливали правильное значение для этого заголовка. Поэтому браузеры решили играть умно и попытаться выяснить тип файла, используя собственные проприетарные алгоритмы.

"Работа с угадыванием", выполняемая браузерами, называется анализом содержимого. Лучший ресурс, который поможет понять, что такое анализатор содержимого, - руководство по безопасности браузера . Еще один замечательный ресурс - , этот документ , чьи предложения теперь включены в Google Chrome и IE8.

Как определить правильный тип файла?

Если вы просто имеете дело с известным / небольшим списком серверов, просто попросите их установить правильный заголовок типа контента и использовать его. Но если вы имеете дело с веб-сайтами, которые вы не можете контролировать, вам, вероятно, придется разработать какой-то алгоритм анализа содержимого.

0 голосов
/ 19 сентября 2015

Для текстовых файлов, таких как 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 (у него была правильная подпись), но в какой-то момент буферы, используемые в библиотеке, переполнились бы, создавая возможность сбоя браузера и, как мы надеемся, взломщика ваш компьютер ...

...