C# 如何判断字节数组是否被gzip压缩

C# 如何判断字节数组是否被gzip压缩,c#,vb.net,gzip,dotnetzip,C#,Vb.net,Gzip,Dotnetzip,如何查看字节数组是否包含gzip流?我的应用程序通过使用Base64编码的http post从其他应用程序获取文件。根据交付文件的应用程序的实现,可以对Base64字符串中的字节数组进行gzip。如何识别gzip阵列?我找到了一些方法,但我认为当有人上传zip文件或 这就是我所发现并发挥作用的,但它能以某种方式被利用吗 C# VB.NET Public Shared Function IsGZip(arr As Byte()) As Boolean Return arr.Length &

如何查看字节数组是否包含gzip流?我的应用程序通过使用Base64编码的http post从其他应用程序获取文件。根据交付文件的应用程序的实现,可以对Base64字符串中的字节数组进行gzip。如何识别gzip阵列?我找到了一些方法,但我认为当有人上传zip文件或

这就是我所发现并发挥作用的,但它能以某种方式被利用吗

C#

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,我的应用程序将解压缩字节数组。

执行您正在执行的操作,检查第三个字节是否为8,然后尝试压缩它。这最后一步是真正了解的唯一途径。如果GunZip失败,那么使用流AS。

这是一个值得怀疑的方法:显式指定格式要安全得多——考虑重新设计。也就是说,
docx
(或其他压缩文档文件格式)是否被视为“Zip”或“单个文档”?根据,Gzip流的头将始终以0x1F8B开头,这就是代码段正在测试的内容。如果我只是上传一个随机文件,它以头开头,但实际上不是Gzip内容,那么它可能会给出一个“假阳性”。如果您还检查了流的CRC,您也会得到更“积极”的结果。唯一简单的方法是实际尝试解压。交付文件的应用程序是外部应用程序,它们通过POST数据提供文件压缩的标志,但我们不能完全依赖于它们声明为某种文件类型的事实。我们必须自己找出答案以确保安全。@vcsjones:如果有人上传了一个坏的gzip流文件怎么办?“坏”是指将10个字节转换为1PT或更大的永无止境的文件。@KeesWit这可能是一个DoS,您的应用程序在尝试分配该字节数组时会耗尽内存,但这可能会在进行此函数调用之前发生。
Public Shared Function IsGZip(arr As Byte()) As Boolean
    Return arr.Length >= 2 AndAlso arr(0) = 31 AndAlso arr(1) = 139
End Function