2011-06-29 11 views
5

Los delincuentes pueden falsificar el tipo de contenido del archivo que está cargando. Entonces, si recibo el archivo en el servidor a través de mi página, no puedo simplemente verificar su tipo MIME y la extensión de archivo. ¿Hay alguna manera confiable de verificar si el archivo cargado es, de hecho, el JPEG, GIF o PNG? Necesito rechazar todos los otros formatos. Podría intentar leer el archivo poco a poco, pero ¿qué estoy buscando? Gracias por cualquier tipo de sugerencias o ideas!Carga de archivos ASP.NET: ¿cómo puedo asegurarme de que un archivo cargado es realmente un archivo JPEG?

Respuesta

5

La forma más sencilla sería la de comprobar la cabecera de la corriente de entrada y buscar firmas específicas:

  • JPEG: FF D8 en hexadecimal
  • GIF: primeros tres bytes "gif"
  • PNG : 137 80 78 71 13 10 26 10 en decimal

Ejemplo en ASP.NET

 bool isValid = false; 
     char[] header = new char[10]; 
     StreamReader sr = new StreamReader(Request.InputStream); 
     sr.Read(header, 0, 10); 

     // check if JPG 
     if (header[0] == 0xFF && header[1] == 0xD8) 
     { 
      isValid = true; 
     } 
     // check if GIF 
     else if (header[0] == 'G' && header[1] == 'I' && header[2] == 'F') 
     { 
      isValid = true; 
     } 
     // check if PNG 
     else if (header[0] == 137 && header[1] == 80 && header[2] == 78 && header[3] == 71 && header[4] == 13 && header[5] == 10 && header[6] == 26 && header[7] == 10) 
     { 
      isValid = true; 
     } 

por supuesto, tendrá que manejar las excepciones

+0

¿Cómo verifico el encabezado en ASP.NET? – Kizz

+0

@Kizz editó la respuesta – Pasman

6

Puede intentar analizar la imagen dentro de un try-catch utilizando Bitmap.FromStream(stream), con la transmisión de la imagen cargada. Si falla, sabes que no es una imagen real. Se considera codificación por excepción, pero en este caso, realmente está buscando una excepción.

+0

Déjame intentarlo ... – Kizz

3

Puede verificar si el archivo tiene JPEG/GIF/PNG file signature. Pero esos también podrían ser imitados por un atacante (aunque probablemente corrompería cualquier exe malicioso). O puede intentar usar Windows Forms, o lo que sea, para convertir los datos de imagen en un mapa de bits y ver si arroja una excepción.

2

No debería necesitar, siempre que lo publique con el tipo MIME que se cargó como. El problema es con ciertos navegadores web (IE) que ignoran el tipo MIME cuando los datos "parecen" algo que cree que sabe cómo manejar. En ese caso, lo que realmente quiere hacer es imitar la detección del tipo de archivo de IE; eso no es fácil a menos que sepa que mira los primeros bytes.

La forma "segura" es volver a codificar la imagen (posiblemente reduciéndola y reduciendo la calidad para reducir el tamaño del archivo). Esto minimiza la cantidad de control que tiene el atacante sobre la salida. (Por supuesto, las personas pueden no apreciar las imágenes recodificadas, pero la mayoría de los servicios web lo hacen).

Además, la recodificación de la imagen generalmente eliminará los metadatos (por ejemplo, el número de serie de la cámara), lo cual es bueno para la privacidad. Esto es especialmente útil cuando un usuario piensa que ha recortado algo pero the image editor leaves it in the thumbnail.

Cuestiones relacionadas