2011-05-14 12 views
7

He tenido esta pregunta por un tiempo: ¿cómo exactamente se determina el tipo de mimo de un archivo? Creo que esto se hace comprobando si los bytes específicos del archivo contienen alguno de los conocidos magic numbers/file signatures, ¿verdad?Fiabilidad de Mimetypes en Cargas (PHP)

Si es así, esto plantea otra pregunta, digamos que subo un script bash con una firma falsa de archivo GIF a un sitio web que solo permite subir imágenes, ¿qué va a pasar? O bien:

  1. la rutina de detección tipo MIME es lo suficientemente inteligente como para detectar las firmas falsas, o
  2. image/gif se devuelve erróneamente como el tipo MIME y se deja que la carga de continuar

no tengo una El editor HEX instaló ATM, y no me gusta formar conclusiones relacionadas con la seguridad de las pruebas ya que podría omitir (o malinterpretar) algo, por lo que mi pregunta es: ¿cuál de las opciones anteriores es la correcta?

Además, ¿hay alguna otra práctica recomendada (además de verificar el tipo MIME) para asegurarse de que un archivo dado es en realidad lo que parece/necesita (o está permitido)? Gracias por adelantado.

PS: Para que quede claro, no estoy preguntando por el índice type en el $_FILES superglobal.

Respuesta

6

Mi comprensión es que las rutinas de determinación MIME en el código de carga de archivos son extremadamente rudimentarias y que el tipo MIME en la matriz $ _FILES simplemente no es confiable. Ha sido mi experiencia que es fácil zorros.

Será mejor que utilice la biblioteca Fileinfo, que proporciona una detección de tipo de archivo más robusta.

http://www.php.net/manual/en/ref.fileinfo.php

+0

El índice 'type' en' $ _FILES' proviene del navegador/usuario, no se puede confiar en absoluto.Estoy usando Fileinfo (o similares), pero la pregunta aún se aplica: si el mimo es falso, ¿Fileinfo es lo suficientemente inteligente como para detectarlo? –

+0

Por lo que entiendo de la documentación, Fileinfo mira el encabezado más algunas heurísticas para detectar el tipo de archivo y no requiere (ni depende de) la información enviada por el navegador. –

+1

La página en fileinfo en el manual de PHP dice que la detección de archivos no es 100% confiable. Asumiría que puedes crear un archivo que pueda engañarlo. – GordonM

-1

Según tengo entendido, esto (tipos MIME vulnerables) es la razón por la que los nombres de los archivos se deben cifrar por diversos medios cuando se cargan y se almacenan en una base de datos para recuperarlos mediante números de identificación. Básicamente, si alguien logra cargar un script malicioso, ¿nunca podrá encontrarlo para ejecutarlo?

+0

Pero el almacenamiento en una base de datos o CDN no siempre es una opción. Obscurecer el nombre del archivo no se puede considerar seguro y tiene el efecto de perder datos semánticos posiblemente valiosos (el nombre del archivo en sí). Soy consciente de las opciones y precauciones arquitectónicas, pero mi pregunta está orientada principalmente hacia la detección de tipo de mimo (¿mal?) Y posibles alternativas. –

2

Si estás hablando $_FILES['userfile']['type'] entonces esta información es enviada por el navegador. Puede o no estar presente e incluso si está presente, debe tratarlo como cualquier otra entrada del usuario.

Si está interesado en buscar imágenes, puede usar la función getimagesize para determinar el tipo de archivo. Esta función devuelve NULL para imágenes que no puede entender. Incluso si devuelve un tipo de imagen válido, puede rechazar el archivo, p. si esperas GIF y JPEG y obtienes un TIFF.

Además, un servidor web determinará si se ejecuta un archivo que no depende de los permisos de archivo (el bit de ejecución y la línea shebang) y la extensión de archivo. Si mantienes un control sobre estos dos, probablemente estés bien.

Cuestiones relacionadas