php - octet - mime type txt
Archivos.rar,.zip Tipo MIME (4)
Estoy desarrollando un simple script de carga php, y los usuarios solo pueden cargar archivos ZIP y RAR.
¿Qué tipos de MIME debo usar para verificar $_FILES[x][type]
? (una lista completa por favor)
Gracias..
Para cargar:
Se puede encontrar una lista oficial de tipos de mime en la Autoridad de números asignados de Internet (IANA) . Según su lista Content-Type
encabezado Content-Type
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: "Le envío una secuencia de archivos y el contenido de esta secuencia no está especificado" (por lo que es cierto que también puede ser un archivo zip
o rar
). El servidor debe detectar cuál es el contenido real de la transmisión.
Nota: Para cargar, no es seguro confiar en el tipo de mimo configurado en el encabezado Content-Type
. El encabezado se establece en el cliente y se puede establecer en cualquier valor aleatorio. En su lugar, puede utilizar las funciones de información de archivo php para detectar el tipo mime del archivo en el servidor.
Para descargar:
Si desea descargar un archivo zip
y nada más, solo debe establecer un único valor de encabezado Accept
. Cualquier conjunto de valores adicionales se usará como respaldo en caso de que el servidor no pueda satisfacerlo en el encabezado Accept
aceptado tipo mime.
De acuerdo con las especificaciones WC3 esto:
application/zip, application/octet-stream
se interpretará como: "Prefiero una application/zip
mime-type, pero si no puede entregar esto una application/octet-stream
(una secuencia de archivos) también está bien".
Entonces solo un single:
application/zip
Le garantizará un archivo zip
(o una 406 - Not Acceptable
Respuesta 406 - Not Acceptable
en caso de que el servidor no pueda satisfacer su solicitud).
Como la 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 verificar todos los caracteres después del último ''''.
La respuesta de freedompeace:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream
Yo también verificaría el nombre del archivo. Aquí es cómo puede verificar si el archivo es un archivo RAR o ZIP. Lo probé creando una aplicación de línea de comando 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;
}
Tenga en cuenta 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
No debe confiar $_FILES[''upfile''][''mime'']
, verifique el tipo MIME usted mismo. Para tal fin, puede usar la extensión fileinfo
, 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 reiniciar su servidor:
extension=php_fileinfo.dll