Как я могу узнать, содержит ли массив байтов 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 возвращает истинное мое приложение распаковывает массив байтов.
Это сомнительный подход: явно заданный формат намного безопаснее - рассмотрите редизайн. То есть это 'docx' (или другой формат файла в формате zip), который рассматривается как« Zip »или« single document »? –
В соответствии с [RFC for Gzip] (http://www.gzip.org/zlib/rfc-gzip.html) заголовок потока Gzip всегда начинается с 0x1F8B, что и проверяет этот фрагмент кода. Он может дать «ложный положительный результат», если я просто загружу случайный файл, который начинается с заголовка, но на самом деле не является содержимым Gzip. Вы также получите гораздо более «положительный» результат, если бы вы также проверили CRC потока. Единственный надежный способ рассказать - это попробовать его распаковать. – vcsjones
Приложения, которые доставляют файлы, являются внешними приложениями, которые предоставляют флаг через данные POST, что файлы заархивированы, но мы не можем полностью полагаться на то, что они объявляют, что это какой-то тип файла. Мы должны найти для себя, чтобы обеспечить безопасность. –