2012-02-01 11 views
11

¿Cómo puedo verificar si un archivo está archivado (zip o rar) sin conocer la extensión? Necesito encontrarlo usando php.Compruebe si un archivo es de archivo (zip o rar) usando php

No puedo usar Fileinfo porque no está instalado y la instalación de cualquier otro paquete en el servidor está fuera de cuestión.

ACTUALIZACIÓN:

postal módulo sus paquetes adicionales no se instala y no puedo instalar. no quiero utilizar mime_content_type porque su obsoleta

Gracias

+0

mime_content_type pero está obsoleto y Fileinfo no está instalado en el servidor y no puedo instalarlo. – keepwalking

+1

$ zip = zip_open ($ file); if (is_resource ($ zip)) {// su zip} else {// no es zip} | pero por desgracia no estoy seguro –

+1

Debe mencionar esto en su pregunta para que no obtenga respuestas sugiriendo usar 'Fileinfo'. Obviamente, mientras más información proporciones, mejores respuestas obtendrás. –

Respuesta

9

salida de od -c:

0000000 R a r ! 032 \a \0 317 220 s \0 \0 \r \0 \0 \0 

    0000000 P K 003 004 \n \0 \0 \0 \0 \0 \0 \0 ! \0 \0 \0 

usted podría utilizar algo como esto:

<?php 

$fh = @fopen($argv[1], "r"); 

if (!$fh) { 
    print "ERROR: couldn't open file.\n"; 
    exit(126); 
} 

$blob = fgets($fh, 5); 

fclose($fh); 

if (strpos($blob, 'Rar') !== false) { 
    print "Looks like a Rar.\n"; 
} else 
if (strpos($blob, 'PK') !== false) { 
    print "Looks like a ZIP.\n"; 
} else { 
    print "I dunno.\n"; 
    exit(1); 
} 

?> 

Y mi salida:

[email protected]:~ 423$ ./filephp.php A2.rar 
Looks like a Rar. 
[email protected]:~ 424$ ./filephp.php OLDIE.zip 
Looks like a ZIP. 
[email protected]:~ 425$ ./filephp.php 1-11-1.PDF 
I dunno. 
[email protected]:~ 426$ 
+2

'=== 0' parece más apropiado – hakre

+0

gracias por la respuesta detallada – keepwalking

+0

Gracias por la respuesta, Fish! – liljoshu

4

Para probar si un archivo es un archivo zip, puede intentar abrirlo como una cremallera utilizando open_zip función. Para rar, necesita tener instalado PECL rar (preferiblemente versión al menos 2.0.0) - vea http://php.net/manual/en/book.rar.php para más detalles. El código podría tener este aspecto:

if(is_resource($zip = zip_open($filename)) 
{ 
    zip_close($zip); 
    //this is a zip archive 
} 
else(($rar = RarArchive::open($filename)) !== FALSE) 
{ 
    $rar->close(); 
    //this is a rar archive 
} 
else 
{ 
    //this is not a zip or rar archive 
} 

Es posible que tenga que hacer un poco de trabajo extra si los archivos están protegidos por contraseña. Lea las páginas correspondientes del manual php para más detalles.

+0

Por qué falta parantheses para 1st si – shadi

+0

Además, esto devolverá 'esto es un zip' si el archivo es de tamaño cero. Use 'if (filesize ($ zipfile) == 0) return false;' para devolver 'esto no es un zip' – shadi

+1

Su código es vulnerable al ataque ZIP Bomb. –

1

Los fileinfo funciones que deben ayudar con esto, mediante la comprobación de tipo mime del archivo:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
echo finfo_file($finfo, $filename); // This will return the mime-type 
finfo_close($finfo); 
+0

Esto tiende a fallar en los documentos de Office 2007+ (DOCX, XLSX, PPTX) en algunos sistemas, por lo que una verificación manual es inevitable. – flu

1

Puede generar la información desde el comando de archivo Unix y analizarlo (suponiendo que puede ejecutar comandos del sistema, lo cual es una mala práctica).

Este es un ejemplo de los archivos "archivo nombre de archivo" salida.

[rr imágenes @ localhost] (maestro) # archivo ui-ui-anim_basic_16x16.gif anim_basic_16x16.gif: los datos de imagen GIF, la versión 89a, 16 x 16

[Imágenes rr @ localhost] (maestro) # archivo ui-icons_454545_256x240.png ui-icons_454545_256x240.png: datos de imagen PNG, 256 x 240, mapa de color de 8 bits, no entrelazado

[rr vendedores @ localhost] (maestro) # archivo jquery-validación -1.9.0.zip jquery-validation-1.9.0.zip: Datos de archivo Zip, al menos v1.0 para extraer

también como otras personas sugeridas, podría leer algunos bytes y comprobar si coinciden con la firma.

para RAR

caracteres Identificación de Hex: 52 61 72 21 07 00 1A, ASCII: Rar!

para postal

caracteres Identificación de Hex: 50 03 04 4B, ASCII: PK

1

Leer primeros 10 bytes del archivo. Si son (80, 75, 3, 4, 20, 0, 0, 0, 8, 0), es un archivo ZIP. Los archivos RAR tienen los siguientes 7 primeros bytes: (82, 97, 114, 33, 26, 7, 0) Si abre un archivo ZIP en un editor de texto (por ejemplo, Notepad ++ ] [EOT] [DC4] [NUL] [NUL] [NUL] [BS] [NUL] ....-> los códigos Ascii para los personajes se enumeran arriba. Para los archivos RAR, la imagen es: ¡Rar! [SUB] [BEL] [NUL] ... Así que solo lea los 10 primeros bytes de un archivo y podrá saber si se trata de un archivo ZIP o RAR. Cheers

+2

si la pregunta es sobre verificarlo php, no sé qué bloc de notas ++ o cualquier solución relacionada con el editor de texto ayuda ... – Tom

+2

Solo debe verificar los primeros 4 bytes contra "\ x50 \ x4b \ x03 \ x04" ya que son firma exclusiva de un archivo PKZip. El byte 5to y 6to, por ejemplo, indican la versión de PKZip necesaria para la extracción (en su ejemplo 2.0) y eso puede variar. Ver: [La estructura de un archivo ZIP] (https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html#localheader) – flu

Cuestiones relacionadas