2013-10-14 79 views
4

如何查看字節數組是否包含壓縮流?我的應用程序通過使用Base64編碼的http post來從其他應用程序獲取文件。根據提供文件的應用程序的實現,可以對Base64字符串輸出的字節數組進行gzip壓縮。我如何識別gzipped數組?我找到了一些方法,但我認爲當某人上傳一個zip文件時它會出錯或者prepared "bad" zip file如何判斷字節數組是否被壓縮

這是我找到並且工作的東西,但是它可以被某種方式利用嗎?

C#

public static bool IsGZip(byte[] arr) 
{ 
    return arr.Length >= 2 && arr[0] == 31 && arr[1] == 139; 
} 

VB.NET

Public Shared Function IsGZip(arr As Byte()) As Boolean 
    Return arr.Length >= 2 AndAlso arr(0) = 31 AndAlso arr(1) = 139 
End Function 

如果IsGzip返回true我的應用程序將解壓縮字節數組。

+0

這是值得懷疑的方法:明確指定格式更安全 - 考慮重新設計。即是被認爲是「Zip」還是「單個文檔」的「docx」(或其他壓縮文檔文件格式)? –

+4

根據[RFC for Gzip](http://www.gzip.org/zlib/rfc-gzip.html),Gzip流的標題總是以0x1F8B開始,這就是代碼片段正在測試的內容。如果我只是上傳一個以標題開始但實際上不是Gzip內容的隨機文件,它可能會產生「誤報」。如果您還檢查了流的CRC,您也會得到更積極的結果。唯一可以說是簡單的方法是實際嘗試解壓縮它。 – vcsjones

+0

提供這些文件的應用程序是外部應用程序,它們通過POST數據提供一個標誌文件壓縮的​​標誌,但我們不能完全依賴於他們聲明它是某種文件類型的事實。我們必須找到自我保證安全。 –

回答

2

做你在做什麼,檢查第三個字節是8,然後嘗試gunzip它。最後一步是真正瞭解的唯一途徑。如果gunzip失敗,則按原樣使用該流。

相關問題