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
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
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.
Déjame intentarlo ... – Kizz
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.
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.
- 1. C# ¿Cómo puedo probar que un archivo es un jpeg?
- 2. ¿HttpPostedFile.ContentType es una forma perfecta de validar un archivo cargado?
- 3. Carga de archivos ASP.NET
- 4. Convertir un archivo cargado en un archivo
- 5. ¿Cómo puedo saber si un archivo en un FTP es idéntico a un archivo local sin realmente descargar el archivo?
- 6. ¿Cómo puedo determinar si un archivo es un archivo PDF?
- 7. ¿Cómo puedo cambiar el nombre de un archivo en ASP.NET?
- 8. ¿Cómo calcular el porcentaje de un archivo cargado?
- 9. ¿Es importante verificar que el archivo cargado sea un archivo de imagen real?
- 10. ¿Cómo asegurar que un archivo cargado es un documento de MS Word?
- 11. Carga de archivo grande en asp.net MVC
- 12. ¿Cómo comprobar si un archivo cargado es una imagen sin tipo de mime?
- 13. C++ - Detecta si un archivo es PNG o JPEG
- 14. ¿Cómo puedo encontrar el tamaño de un archivo cargado en Ruby on Rails?
- 15. ¿Qué es un archivo dll.refresh en ASP.Net?
- 16. C# leer un archivo JPEG de un archivo y almacenarlo como una imagen
- 17. ¿Realmente necesito un archivo MainWindow.xib?
- 18. ¿Cómo puedo imprimir un conjunto de archivos en un archivo, un nombre de archivo por línea?
- 19. jQuery tomar un archivo cargado con tipo de entrada = 'archivo'
- 20. ¿Cómo puedo determinar si un archivo cargado es un archivo CSV válido, o al menos texto, en ColdFusion 8?
- 21. Tamaño del archivo cargado
- 22. Obtener datos de un archivo Excel cargado sin guardar en el sistema de archivos
- 23. ¿Cómo recupero ApplicationSettings de un archivo App.config cargado?
- 24. ImageIO no puede escribir un archivo JPEG
- 25. Cómo escribir un decodificador de archivos JPEG desde cero
- 26. Carga mediante programación de un archivo
- 27. cómo evitar que la carga de archivo exe en asp.net mvc
- 28. ¿Cómo puedo determinar si un archivo es un archivo de imagen en .NET?
- 29. Cómo implementar la carga de archivo BlueQuery jQuery en ASP.NET
- 30. problema de carga de archivo
¿Cómo verifico el encabezado en ASP.NET? – Kizz
@Kizz editó la respuesta – Pasman