2013-10-14 6 views
4

Comment puis-je voir si un tableau d'octets contient un flux zip? Mon application obtient des fichiers d'autres applications via http post avec l'encodage Base64. En fonction de l'implémentation de l'application qui fournit les fichiers, le tableau d'octets issu de la chaîne Base64 peut être gzippé. Comment puis-je reconnaître les tableaux gzippés? J'ai trouvé une méthode, mais je pense que ça va mal tourner quand quelqu'un télécharge un fichier zip ou prepared "bad" zip fileComment savoir si un tableau d'octets est gzippé

C'est ce que j'ai trouvé et qui fonctionne, mais peut-il être exploité d'une certaine façon?

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 

Si le IsGzip renvoie true mon application décompresse le tableau d'octets.

+0

Il s'agit d'une approche discutable: spécifier explicitement le format est beaucoup plus sûr - envisager une nouvelle conception. C'est à dire. est-ce que 'docx' (ou tout autre format de fichier de document zippé) est considéré comme" Zip "ou" document unique "? –

+4

Selon le [RFC for Gzip] (http://www.gzip.org/zlib/rfc-gzip.html), l'en-tête d'un flux Gzip commence toujours par 0x1F8B, ce que l'extrait de code teste. Cela peut donner un "faux positif" si je télécharge simplement un fichier aléatoire qui commence par l'en-tête mais qui n'est pas réellement du contenu Gzip. Vous obtiendrez également un résultat beaucoup plus "positif" si vous avez également vérifié le CRC du flux. Le seul moyen infaillible de dire est d'essayer de le décompresser. – vcsjones

+0

Les applications qui fournissent les fichiers sont des applications externes qui fournissent un indicateur via les données POST que les fichiers sont zippés, mais nous ne pouvons pas compter entièrement sur le fait qu'ils déclarent qu'il s'agit d'un type de fichier. Nous devons découvrir par nous-mêmes pour assurer la sécurité. –

Répondre

2

Faites ce que vous faites, vérifiez que le troisième octet est 8, puis essayez de le lancer. Cette dernière étape est la seule façon de vraiment savoir. Si le gunzip échoue, utilisez le flux tel quel.

Questions connexes