密码学系列之:内容嗅探
文章目錄
- 簡介
- MIME types
- 瀏覽器嗅探
- 客戶端嗅探
簡介
內容嗅探,也被稱為媒體類型嗅探或MIME嗅探,是檢查一個字節流的內容,試圖推斷其中數據的文件格式的做法。內容嗅探通常用在媒體類型沒有被準確指定的情況,用于補償元數據信息。
本文將會講解內容嗅探的常用場景和可能出現的問題。
MIME types
MIME的全稱是Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展。它是一種標準,它表明了文檔、文件或各種字節的性質和格式。它是在IETF的RFC 6838中定義的?;ヂ摼W編號分配機構(IANA)負責定義所有官方的MIME類型。
MIME的結構包含兩部分,分別是type和subtype,他們以 / 來進行分割:
type/subtype類型代表數據類型所屬的一般類別,如視頻或文本。子類型確定MIME類型所代表的指定類型的確切數據種類。例如,對于 MIME 類型的文本,子類型可能是 plain(純文本)、html(HTML 源代碼)或日歷(對于 iCalendar/.ics)文件。
每種類型都有它自己的一套可能的子類型, 一個MIME類型必須包含一個類型和一個子類型。
還可以在后面加上額外的參數:
type/subtype;parameter=value例如,對于主類型是text的任何MIME類型,可選的charset參數可以用來指定數據中字符的字符集。如果沒有指定字符集,默認為ASCII (US-ASCII),除非被用戶代理的設置覆蓋。要指定UTF-8文本文件,則使用MIME類型text/plain;charset=UTF-8。
MIME類型不區分大小寫,但傳統上用小寫,但參數值除外,因為參數值的大小寫可能有或沒有特定的意義。
MIME有兩中類型,分別是discrete 和multipart。
離散類型是代表單一文件或媒介的類型,如單一文本或音樂文件,或單一視頻。
多部分類型是指由多個組件組成的文件,每個組件都有自己獨立的MIME類型;或者,指封裝在一個事務中一起發送的多個文件。例如,電子郵件中多個附件就是一種多部分MIME類型。
我們看下常見的discrete類型:
常見的Multipart類型如下:
瀏覽器嗅探
因為瀏覽器使用MIME類型,而不是文件擴展名來決定如何處理一個URL,所以Web服務器在響應的Content-Type頭中發送正確的MIME類型非常重要。如果沒有正確配置,瀏覽器很可能會誤解文件的內容,網站將無法正常運行,下載的文件也可能會被錯誤處理。
為了解決這個問題,或者說是更好的用戶體驗,很多瀏覽器會進行MIME內容嗅探,也就是通過解析文件的內容,來猜測MIME類型的格式。
不同的瀏覽器處理MIME嗅探的方式是不一樣的。但是他們都可能會產生嚴重的安全漏洞,因為有些MIME類型是可執行類型的,惡意攻擊者可以通過混淆MIME嗅探算法,從而使攻擊者可以進行網站運營者或用戶都沒有預料到的操作,如跨站腳本攻擊。
如果不想瀏覽器端進行嗅探,可以在服務端的響應中設置 X-Content-Type-Options 頭,比如:
X-Content-Type-Options: nosniff這個頭最早是在IE 8中支持的,不過現在所有的瀏覽器基本都支持這個head類型了。
客戶端嗅探
我們通常需要在JS中判斷瀏覽器是否是IE瀏覽器,然后做響應的處理:
var isIEBrowser = false; if (window.ActiveXObject) {isIEBrowser = true; }// Or, shorter: var isIE = (window.ActiveXObject !== undefined);上面的例子就是非常簡單的客戶端嗅探,通過判斷window是否有ActiveXObject 這個屬性來確定這個瀏覽器是否是IE瀏覽器。
本文已收錄于 http://www.flydean.com/content-sniffing/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!
總結
以上是生活随笔為你收集整理的密码学系列之:内容嗅探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础之:函数
- 下一篇: ECMAScript 2016(ES7)