validar tipo tamaño subir seguridad restringir guardar extension ejemplo archivos archivo _files php validation file-upload mime-types

tipo - validar extension de archivo php



¿Cómo verificar los tipos de archivos cargados en PHP? (6)

En el sitio web de PHP, la única comprobación real que sugieren es usar is_uploaded_file() o move_uploaded_file() , here . Por supuesto, generalmente no desea que el usuario cargue ningún tipo de archivo por una variedad de razones.

Debido a esto, a menudo he usado alguna comprobación de tipo MIME "estricta". Por supuesto, esto es muy defectuoso porque a menudo los tipos de mime son incorrectos y los usuarios no pueden subir su archivo. También es muy fácil de falsificar y / o cambiar. Y junto con todo eso, cada navegador y sistema operativo los trata de manera diferente.

Otro método es verificar la extensión, que por supuesto es aún más fácil de cambiar que el tipo de mimo.

Si solo quieres imágenes, usar algo como getimagesize() funcionará.

¿Qué pasa con otros tipos de archivos? PDF, documentos de Word o archivos de Excel? ¿O incluso solo archivos de texto?

Editar: si no tiene mime_content_type o Fileinfo y el sistema ("archivo -bi $ uploadedfile") le da el tipo de archivo incorrecto, ¿qué otras opciones hay?


Aquí está la función file_mime_type de iZend:

function file_mime_type($file, $encoding=true) { $mime=false; if (function_exists(''finfo_file'')) { $finfo = finfo_open(FILEINFO_MIME); $mime = finfo_file($finfo, $file); finfo_close($finfo); } else if (substr(PHP_OS, 0, 3) == ''WIN'') { $mime = mime_content_type($file); } else { $file = escapeshellarg($file); $cmd = "file -iL $file"; exec($cmd, $output, $r); if ($r == 0) { $mime = substr($output[0], strpos($output[0], '': '')+2); } } if (!$mime) { return false; } if ($encoding) { return $mime; } return substr($mime, 0, strpos($mime, ''; '')); }


Eche un vistazo a mime_content_type o Fileinfo . Estos son comandos integrados de PHP para determinar el tipo de archivo mirando el contenido del archivo. También verifique los comentarios en las dos páginas anteriores, hay algunas otras buenas sugerencias.

Personalmente he tenido suerte usando algo que es esencialmente un system("file -bi $uploadedfile") , pero no estoy seguro de si ese es el mejor método.


En mi humilde opinión, todos los métodos de comprobación de tipo MIME son inútiles.

Digamos que tienes que debería tener application/pdf tipo MIME. Los métodos estándar intentan encontrar algo que se parezca a un encabezado de PDF ( %PDF- o algo así) y devolverán ''Bien, parece que este es un archivo PDF'' en caso de éxito. Pero, de hecho, esto no significa nada. Puede cargar un archivo que contenga solo %PDF-1.4 y pasará la verificación MIME.

Quiero decir, si el archivo tiene un tipo MIME esperado, siempre pasará la verificación de tipo MIME; de lo contrario, el resultado no está definido.


Supongo que va a tener una lista blanca fija de tipos de archivos que aceptará.

Para cada uno de estos tipos, tendrá que usar diferentes técnicas para verificar que sean ejemplos válidos de ese formato.

Hay dos preguntas relacionadas:

  • ¿Se ve más o menos como podría ser el tipo correcto? (Para JPEG, podría verificar los encabezados, como mencionó. Para muchos formatos basados ​​en Unix, podría verificar la "cookie mágica").

  • ¿Es realmente un ejemplo válido de ese tipo (por ejemplo, para cualquier formato similar al XML, puede validar contra un DTD).

Creo que, para cada formato, debe hacer preguntas por separado para cada uno, porque la respuesta será bastante diferente para los archivos PDF en comparación con los archivos ZIP.


Usé mime_content_type que es compatible con PHP 5.2, porque no puedo usar Fileinfo (requiere PHP 5.3) ni system() , que está deshabilitado por mi proveedor. Por ejemplo, verifico si un archivo es un archivo de texto así que:

if (strcmp(substr(mime_content_type($f),0,4),"text")==0) { ... }

Puede ver un ejemplo completo en mi "Directorio PHP y Subdirectorio de escucha y visor y descargador de archivos" en: http://www.galgani.it/software_repository/index.php


if(isset($_FILES[''uploaded''])) { $temp = explode(".", $_FILES["uploaded"]["name"]); $allowedExts = array("txt","htm","html","php","css","js","json","xml","swf","flv","pdf","psd","ai","eps","eps","ps","doc","rtf","ppt","odt","ods"); $extension = end($temp); if( in_array($extension, $allowedExts)) { //code.... } else { echo "Error,not Documentum type..."; } }