Ver Mensaje Individual
  #4 (permalink)  
Antiguo 24/08/2006, 22:27
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Buenas, en esta ocasión disiento con Cluster.

Si tomás un archivo .exe y lo renombrás como .txt, el mime-type que te va a mostrar el array $_FILES es text/plain. (Hacé la prueba vos mismo).

El mime-type no es ninguna garantía porque es un dato que entrega el cliente y los headers de un archivo también se pueden modificar a gusto con cualquier editor hexadecimal (hay que conocer el formato, lógico, pero se puede hacer; algunos formatos son muy simples).

No conozco en detalle qué es lo que hace un navegador como el IE o el FF con respecto al mime-type que entrega, pero tiene toda la pinta de que si tiene una extensión a mano, simplemente busca el mime asociado a esa extensión y listo (con un par de pruebas podés comprobar que el mime-type que envía es siempre el que está asociado a la extensión del archivo, o application/octect-stream si no lo conoce o no hay extensión).

Tengo la impresión de que validar por mime-type suele dar una (falsa) sensación de "seguridad" al que programa un upload. Dudo mucho que sea más seguro y le veo la contra anterior.

Otra cosa: si buscás en google vas a ver que páginas que explican exploits basados en validaciones de archivos por mime-types. No conozco el tema, pero por lo que explican, lo que hacen comunicarse directamente con el servidor (sin usar un broswer), imitar el envío algún mime-type arbitrario y el archivo a subir. Con esto podrían subir un archivo .php haciéndolo pasar por un .jpg, por ejemplo. Ahí habría un verdadero problema, porque si el archivo es .php, cualquiera lo puede ejecutar con sólo un navegador. Por eso creo que la extensión es lo más importante (de última, si alguien sube un .txt que en realidad contiene código .php, no va a poder hacerlo correr directamente; no es lo más tranquilizador, pero sería la "menos peor" de las dos opciones).

Y me parece que ahí está el punto importante. Suponiendo que el archivo no puede ejecutarse directamente, la seguridad depende de qué hagas vos con ese archivo. Partiendo de la base de que una de las peores cosas que podrían pasar es que alguien pudiera ejecutar código php a discresión, en la medida en que con ese archivo no hagas cosas como require(), include(), o usar eval() no veo por ese lado cómo podría alguien hacer algo con el archivo "malicioso" que acaba de subir. (Que no lo vea yo no quiere decir que no lo vea otro más avispado...)

Suerte
Califa

PD: Ya alguna vez había estado en una discusión muy parecida; por ahí debe andar algún link que dejé sobre este tema, si a alguien le interesa echarle un vistazo