2013-10-14 2 views
4

Как я могу узнать, содержит ли массив байтов zip-поток? Мое приложение получает файлы из других приложений через http-сообщение с кодировкой Base64. В зависимости от реализации приложения, которое доставляет файлы, массив байтов, который выходит из строки Base64, может быть gzipped. Как я могу распознать gzipped-массивы? Я нашел какой-то метод, но я думаю, что он пойдет не так, когда кто-то загрузит zip-файл или prepared "bad" zip fileКак определить, является ли массив байтов gzipped

Это то, что я нашел и работает, но может ли он каким-то образом быть использован?

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 возвращает истинное мое приложение распаковывает массив байтов.

+0

Это сомнительный подход: явно заданный формат намного безопаснее - рассмотрите редизайн. То есть это 'docx' (или другой формат файла в формате zip), который рассматривается как« Zip »или« single document »? –

+4

В соответствии с [RFC for Gzip] (http://www.gzip.org/zlib/rfc-gzip.html) заголовок потока Gzip всегда начинается с 0x1F8B, что и проверяет этот фрагмент кода. Он может дать «ложный положительный результат», если я просто загружу случайный файл, который начинается с заголовка, но на самом деле не является содержимым Gzip. Вы также получите гораздо более «положительный» результат, если бы вы также проверили CRC потока. Единственный надежный способ рассказать - это попробовать его распаковать. – vcsjones

+0

Приложения, которые доставляют файлы, являются внешними приложениями, которые предоставляют флаг через данные POST, что файлы заархивированы, но мы не можем полностью полагаться на то, что они объявляют, что это какой-то тип файла. Мы должны найти для себя, чтобы обеспечить безопасность. –

ответ

2

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

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