2010-09-07 25 views
0

我一直認爲HTTP Content-Type應該正確識別返回資源的內容。我最近注意到來自google.com的資源與類似/extern_chrome/799678fbd1a8a52d.js的文件名中包含的HTTP標頭:確定Web服務器返回的文件類型的正確方法是什麼?

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類型爲「腳本」。

是否有一種可接受的方法來確定從Web服務器返回的內容?內容類型標題似乎通常是正確的。擴展也是一個指標,但並不總是準確的。檢查文件內容的唯一準確方法是什麼? Web瀏覽器是如何確定如何處理內容的?

回答

1

瀏覽器知道它是JavaScript,因爲它通過<script src="...">標記到達它。

如果您將.js文件的URL鍵入到URL的地址欄中,那麼即使服務器確實返回了正確的Content-Type,瀏覽器也不會將該文件視爲要執行的JavaScript文件。 (相反,您可能會在瀏覽器窗口中看到.js源代碼,或者根據您的瀏覽器提示將其保存爲文件。)

瀏覽器不會對JavaScript執行任何操作,除非它被引用一個<script>標籤,簡單明瞭。不需要內容嗅探。

1

是檢查文件內容的唯一準確方法嗎?

它是瀏覽器用來確定文件類型的方法,但並不準確。它不準確的事實是security的擔憂。

服務器可用於指示文件類型的唯一方法是通過Content-Type HTTP標頭。不幸的是,在過去,沒有多少服務器爲這個標頭設置正確的值。所以瀏覽器決定玩弄聰明,試圖用他們自己的專有算法找出文件類型。

瀏覽器完成的「猜測工作」被稱爲內容嗅探。瞭解內容嗅探的最佳資源是browser security handbook。另一個很好的資源是this paper,其建議現在已被納入Google Chrome和IE8。

如何確定正確的文件類型?

如果你只是處理服務器的已知/小單子,簡單地問他們確立正確的Content-Type頭,並使用它。但是,如果你正在處理你無法控制的野外網站,你可能不得不開發某種內容探測算法。

0

對於文本文件,例如JavaScript,CSS和HTML,瀏覽器將嘗試解析文件。如果解析失敗後才能解析,則認爲它是完全無效的。否則,儘可能多地保留和使用。對於JavaScript,它可能需要語法編譯所有內容。

對於二進制文件,如Flash,PNG,JPEG,WAVE文件,他們可以使用庫,如magic library。魔術庫使用文件的內容確定文件的MIME類型,該文件實際上是唯一可信的部分。

但是,不管怎樣,當您在瀏覽器中拖放一個文檔時,這種情況下瀏覽器的啓發式就是檢查文件擴展名。真弱!因此,附加到POST文件可能是一個.exe,你會認爲它是一個PNG,因爲這是當前的文件擴展名...

我有一些代碼來測試JavaScript中的文件的MIME類型(一個拖放或瀏覽...)後:

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類型的插件中找到的基本MIME類型。

它都是面向對象的代碼,所以開始時可能有點困難,但或多或​​少,很多調用都是異步的。

是否有可接受的方法來確定從Web服務器返回的內容?內容類型標題似乎通常是正確的。擴展也是一個指標,但並不總是準確的。

據我所知,Apache使用文件擴展名。假設您信任您的網站管理員並且最終用戶無法上傳內容,那麼擴展實際上是相當安全的。

是檢查文件內容的唯一準確方法嗎?

準確和安全,是的。也就是說,使用數據庫系統的服務器可以將這些元數據保存在數據庫中,因此無需在每次處理文件時都要重新檢查。此外,一旦檢測到該類型,它可以嘗試加載以仔細檢查MIME類型是否合適。這甚至可以在後端過程發生,所以你不要浪費客戶的時間(其實我的服務器更進一步,檢查每個病毒文件無法加載得到某種方式檢查過,所以即使文件。)

Web瀏覽器是如何確定如何處理內容的?

正如Joe White所提到的,在大多數情況下,瀏覽器需要一個文件中的特定類型的數據:CSS的鏈接需要CSS數據;一個腳本需要JavaScript,Ruby,ASP;圖像或數字標籤需要圖像;等等。

因此,瀏覽器可以使用該類型的數據加載器,如果加載失敗,它知道它不是正確的類型。所以瀏覽器本身並不需要檢測類型。但是,您必須相信,當數據流無效時,加載程序會正常失敗。這就是爲什麼我們有更新的Flash播放器和回來的GIF庫的更新。

類型的檢測,如魔術庫所做的那樣,只會在文件開始時讀取「少量」字節並根據此類型確定類型。這並不意味着該文件是有效的並且可以安全地加載。 GIF錯誤意味着該文件非常像GIF圖像(它具有正確的簽名),但是在某些情況下,庫中使用的緩衝區溢出可能會導致瀏覽器崩潰,並希望黑客能夠接管你的電腦...

相關問題