.rar,.archivos zip Tipo MIME


Estoy desarrollando un simple script de carga php, y los usuarios solo pueden cargar archivos ZIP y RAR.

¿Qué tipos MIME debo usar para comprobar $_FILES[x][type]? (una lista completa por favor)

Gracias..

Author: mrdaliri, 2011-08-08

4 answers

Las respuestas de freedompeace, Kiyarash y Sam Vloeberghs:

.rar    application/x-rar-compressed, application/octet-stream
.zip    application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip

Yo también revisaría el nombre del archivo. Aquí es cómo se puede comprobar si el archivo es un archivo RAR o ZIP. Lo probé creando una aplicación de línea de comandos rápida.

<?php

if (isRarOrZip($argv[1])) {
    echo 'It is probably a RAR or ZIP file.';
} else {
    echo 'It is probably not a RAR or ZIP file.';
}

function isRarOrZip($file) {
    // get the first 7 bytes
    $bytes = file_get_contents($file, FALSE, NULL, 0, 7);
    $ext = strtolower(substr($file, - 4));

    // RAR magic number: Rar!\x1A\x07\x00
    // http://en.wikipedia.org/wiki/RAR
    if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
        return TRUE;
    }

    // ZIP magic number: none, though PK\003\004, PK\005\006 (empty archive), 
    // or PK\007\008 (spanned archive) are common.
    // http://en.wikipedia.org/wiki/ZIP_(file_format)
    if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') {
        return TRUE;
    }

    return FALSE;
}

Observe que todavía no será 100% seguro, pero probablemente sea lo suficientemente bueno.

$ rar.exe l somefile.zip
somefile.zip is not RAR archive

Pero incluso WinRAR detecta archivos no RAR como archivos SFX:

$ rar.exe l somefile.srr
SFX Volume somefile.srr
 194
Author: Gfy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 17:55:45

Para subir:

Se puede encontrar una lista oficial de tipos mime en La Autoridad de Números Asignados de Internet (IANA) . De acuerdo con su lista Content-Type el encabezado para zip es application/zip.

El tipo de medio para los archivos rar no está registrado oficialmente en IANA, pero el valor no oficial de tipo mime comúnmente utilizado es application/x-rar-compressed.

application/octet-stream significa tanto como: "Te envío un flujo de archivos y el contenido de este flujo no se especifica" (por lo que es cierto que puede ser un zip o rar también). Se supone que el servidor detecta cuál es el contenido real de la transmisión.

Nota: Para cargar no es seguro confiar en el tipo mime establecido en el encabezado Content-Type. El encabezado se establece en el cliente y se puede establecer en cualquier valor aleatorio. En su lugar, puede usar las funciones php file info para detectar el tipo de archivo mime en el servidor.


Para descargar:

Si desea descargar un archivo zip y nada más, debe solo establezca un único valor de encabezado Accept. Cualquier valor adicional será usado como reserva en caso de que el servidor no pueda satisfacer el tipo mime solicitado en el encabezado Accept.

De acuerdo con las especificaciones WC3 esto:

application/zip, application/octet-stream 

Se interpretará como: "Prefiero un tipo mime application/zip, pero si no puede entregar esto, un application/octet-stream (un flujo de archivos) también está bien".

Así que solo un solo:

application/zip

Le garantizará un archivo zip (o un 406 - Not Acceptable respuesta en caso de que el servidor no pueda satisfacer su solicitud).

 23
Author: Wilt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 08:01:01

No debe confiar en $_FILES['upfile']['mime'], verifique el tipo MIME usted mismo. Para tal fin, puede utilizar fileinfo extensión , habilitada por defecto a partir de PHP 5.3.0.

  $fileInfo = new finfo(FILEINFO_MIME_TYPE);
  $fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
  $validMimes = array( 
    'zip' => 'application/zip',
    'rar' => 'application/x-rar',
  );

  $fileExt = array_search($fileMime, $validMimes, true);
  if($fileExt != 'zip' && $fileExt != 'rar')
    throw new RuntimeException('Invalid file format.');

NOTA: No olvide habilitar la extensión en su php.ini y reinicie su servidor:

extension=php_fileinfo.dll
 4
Author: fibriZo raZiel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-06 13:31:23

Como extensión puede contener más o menos tres caracteres, lo siguiente probará una extensión independientemente de su longitud.

Prueba esto:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

Para comprobar todos los caracteres después del último".'

 -1
Author: theking2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 16:12:09