2010-08-20 41 views
5

Estoy creando un script de carga de archivos y estoy buscando las mejores técnicas y prácticas para validar los archivos cargados.Validación de archivos de carga de PHP

extensiones permitidas son:

$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd'); 

Aquí está la lista de lo que estoy haciendo.

  1. Comprobación de extensión de archivo

    $path_info = pathinfo($filename); 
    if(!in_array($path_info['extension'], $allowed_extensions)) { 
        die('File #'.$i.': Incorrent file extension.'); 
    } 
    
  2. archivo de comprobación de tipos MIME

    $allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop'); 
    if(!in_array(finfo_file($finfo, $file), $allowed_mimes)) { 
        die('File #'.$i.': Incorrent mime type.'); 
    } 
    
  3. Comprobación de tamaño del archivo.

¿Qué debo hacer para asegurarme de que los archivos cargados son válidos? Noté algo extraño. Cambié la extensión de archivo .jpg a .zip y ... se cargó. Pensé que tendría un tipo MIME incorrecto, pero después de eso me di cuenta de que no estoy buscando un tipo específico, pero si existe un tipo MIME específico en el conjunto. Lo arreglaré más tarde, eso no presenta ningún problema para mí (por supuesto, si tienes una buena solución/idea, no dudes en compartirla, por favor).

Sé qué hacer con las imágenes (intente redimensionar, rotar, recortar, etc.), pero no tengo idea de cómo validar otras extensiones.

Ahora es el momento de hacer mis preguntas.

  1. ¿Conoces buenas técnicas para validar dichos archivos? Tal vez debería descomprimir archivos para archivos .zip/.rar, pero ¿qué pasa con los documentos (doc, pdf)?
  2. ¿Va a rotar, cambiar el tamaño de trabajo para archivos .psd?
  3. Básicamente pensé que el archivo .psd tiene las siguientes MIME: application/octet-stream pero cuando

me trataron de subir .psd presentar Me mostró (imagen/vnd.adobe.photoshop). Estoy un poco confundido acerca de esto. ¿Los archivos siempre tienen el mismo tipo MIME?

Además, no puedo forzar el bloqueo de código para que funcione. ¿Alguien tiene una idea de por qué?

Respuesta

3

Muchos de los formatos de archivo tienen un conjunto bastante estándar de bytes iniciales para indicar el formato.Si realiza una lectura binaria para los primeros bytes y los compara con los bytes iniciales de formatos conocidos, debería ser una forma bastante confiable de confirmar que el tipo de archivo coincide con la extensión.

Por ejemplo, los bytes de inicio de JPEG son 0xFF, 0xd8; así que algo así como:

$fp = fopen("filename.jpg", "rb"); 
$startbytes = fread($fp, 8); 
$chunked = str_split($startbytes,1); 
if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){ 
    $exts[] = "jpg"; 
    $exts[] = "jpeg"; 
} 

luego verifique contra los exts.

podría funcionar.

+0

Entonces, corríjame si me equivoco, si los bytes de inicio de JPEG son diferentes de '0xFF, 0xD8;' significa que el archivo no es válido ¿no? ¿Hay alguna lista de "bytes iniciales" por ahí? O ... ¿cómo puedo crearlo? – Tom

+2

Aquí hay una lista decente: http://www.mikekunz.com/image_file_header.html Falta un archivo PNG, pero su encabezado es bastante consistente por lo que he visto. –

+0

@Collin Allen: ¡Muchas gracias! Ahora sé qué buscar. – Tom

4

Si desea validar imágenes, una buena cosa es usar getimagesize(), y ver si devuelve un conjunto de tamaños válido, o errores si es un archivo de imagen no válido. O use una función similar para cualquier archivo que intente admitir.

La clave es que el nombre del archivo significa absolutamente nada. Las extensiones de archivo (.jpg, etc.), los tipos de mime ... son para humanos.

La única forma en que puede garantizar que un archivo es del tipo correcto es abrirlo y evaluarlo byte por byte. Esto es, obviamente, una tarea bastante desalentadora si quieres intentar validar una gran cantidad de tipos de archivos. En el nivel más simple, observaría los primeros bytes del archivo para asegurarse de que coincidan con lo que se espera de un archivo de ese tipo.

+0

¿Conoces algún manual o documento para analizar los primeros bytes? – Tom