2010-09-07 5 views
0

Я всегда считал, что 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 кажется обычно правильным. Расширения также являются индикатором, но не всегда точными. Является единственным точным методом для изучения содержимого файла? Это то, что делают веб-браузеры, чтобы определить, как обрабатывать контент?

ответ

1

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

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

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

1

Это единственный точный метод для изучения содержимого файла?

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

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

«Догадка», выполняемая браузерами, называется обнюхиванием контента. Лучшим ресурсом для понимания обнюхивания контента является browser security handbook. Еще один большой ресурс - this paper, предложения которого теперь включены в Google Chrome и IE8.

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

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

0

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

Смежные вопросы