2010-10-26 8 views
7

Quiero validar el tipo de archivo para asegurarme de que el usuario está cargando una imagen de tipo JPEG, GIF o PNG. En lugar de verificar la extensión del archivo, pensé que usar HttpPostedFile.ContentType sería más seguro ya que verifica el tipo de contenido MIME.¿HttpPostedFile.ContentType es una forma perfecta de validar un archivo cargado?

protected void cvValidateImageType_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    if (fupImage.HasFile) 
    { 
     args.IsValid = (fupImage.PostedFile.ContentType.ToLower() == "image/jpg" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/jpeg" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/pjpeg" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/gif" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/x-png" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/png"); 

    } 
    else 
     args.IsValid = true; 
} 

¿Es esta una forma perfecta de verificar el tipo de archivo, o puede ser engañado?

Respuesta

6

El uso de la extensión es probablemente más seguro. ContentType se envía en la solicitud http del cliente. Si prueba la extensión, el usuario puede cambiar la extensión de un exe a jpg, pero no se ejecutará como un exe.

4

Tanto el uso de la extensión como los encabezados HTTP son igualmente poco confiables, ya que ambos pueden fingirse fácilmente, ya sea por un atacante malintencionado que utiliza solicitudes HTTP sin procesar o por un inocente usuario del navegador que elige un archivo con un nombre incorrecto. Si quiere estar seguro, debe abrir el archivo y analizar el contenido, no hay otra manera.

Cuestiones relacionadas