2010-04-07 55 views
11

Estoy desarrollando una aplicación web ASP.NET y me gustaría que el usuario pueda cargar una imagen desde su sistema local o pasar una URL a una imagen. La imagen puede ser JPG o PNG. ¿Qué problemas de seguridad debería preocuparme por hacer esto? He visto varias formas de incrustar código dentro de archivos JPG. ¿Hay algún método en C# (o librerías externas) que pueda confirmar que un archivo es JPG/PNG, de lo contrario arrojaría un error? Por lo menos, estoy haciendo que el directorio que mantiene las imágenes cargadas no sea explorable y que ponga un límite de tamaño máximo de 1 mb, pero me gustaría implementar más controles.Carga de imágenes: problemas de seguridad

Gracias por cualquier consejo.

Respuesta

12

¿Existen métodos en C# (o librerías externas) que puede confirmar que un archivo es un archivo JPG/PNG, de lo contrario generará un error?

Tal vez, pero eso en realidad no ayuda en sí mismo. Puede crear fácilmente un archivo que sea un formato de imagen válido y que contenga contenido HTML/script activo para que se detecte el contenido de IE. O bien, hay que preocuparse por las políticas de origen de Java y Flash rotas, que pueden tener el mismo efecto de las secuencias de comandos en el contexto de seguridad de su servidor.

  1. Si procesa la imagen (por ejemplo. Recortar, redimensionar) y volver a salvar lo que hace que sea muy, muy difícil de hacer ataques de contenido contrabando. Sin embargo, siempre debe asegurarse de que las herramientas del lado del servidor estén actualizadas, ya que las vulnerabilidades en las bibliotecas de procesamiento de imágenes pueden exponerlo a un exploit del lado del servidor.

  2. Si no puede hacer eso, su mejor opción como mitigación para todos los problemas de inyección de contenido es servir sus imágenes desde un [sub] dominio diferente que no tiene acceso a ninguna de las credenciales confidenciales (cookies, autenticación básica) del sitio principal.

  3. Si se utiliza un subdominio para este propósito, como images.example.com, su sitio principal debe ser accesible solamente través www.example.comy noexample.com. De lo contrario, el contenido inyectado en images.example.com puede acceder a las cookies para example.com en IE. example.com debe 301-redirigir a www.example.com para evitar fugas de cookies no deseadas en general.

  4. Agregue el encabezado X-Content-Type-Options: nosniff a la respuesta al bloqueo de contenido-contrabando de IE8. (No ayuda con versiones anteriores, por desgracia.)

también:

  1. Desinfección nombres de archivos especificados por el usuario es duro, especialmente si su aplicación es probable que ejecuta en un servidor Windows en el las reglas sobre los nombres de archivo utilizables son realmente complicadas. Un buen lugar para comenzar es permitir solo caracteres alfanuméricos y agregar su propia extensión de archivo y prefijo. (Es necesario un prefijo para evitar los nombres de archivo reservados de Windows y el nombre de archivo vacío).

  2. Mejor: almacene el nombre de archivo proporcionado por el usuario en la base de datos en lugar de usarlo como un nombre de archivo real.

Consulte this question para obtener más información sobre la carga de archivos en los problemas de seguridad.

+0

Hola. ¿Cuál sería la mejor forma de procesar una imagen? ¿Sería suficiente simplemente leer la imagen y guardarla en mi sistema de archivos (con mi propio esquema de nombres)? Gracias – keyboardP

+0

Por 'proceso' quiero decir cargarlo en un procesador de imagen, hacer algo con la imagen y guardarla. Utilizarías 'System.Drawing.Bitmap' en .NET. Desafortunadamente, si la imagen es JPEG, el re-guardado le cuesta calidad de imagen, por lo que este no es un buen método si necesita preservar la imagen original exacta. – bobince

+0

Creo que puedo seguir adelante y utilizar un servicio como Amazon S3 para almacenar las imágenes. Supongo que esto mitigaría la mayoría de los riesgos? (Especialmente el hecho de que no hay implicación de mi servidor con los archivos de imagen). – keyboardP

3

No permita que el usuario determine el nombre de archivo que se utilizará en su servidor. Use [generated guid] .jpg en su lugar y ponga el nombre del archivo que usaron en la tabla de la base de datos si lo necesita.

Ver # 12 aquí: http://www.codinghorror.com/blog/2009/01/top-25-most-dangerous-programming-mistakes.html

control externo de Nombre de archivo o ruta Cuando se utiliza la entrada de un forastero durante la construcción de un nombre de archivo, la trayectoria resultante podría apuntar fuera del directorio deseado. Un atacante podría combinar múltiples secuencias "..." o similares para hacer que el sistema operativo salga del directorio restringido . Otros ataques relacionados con los archivos se simplifican control externo de un nombre de archivo, tales enlace como simbólica siguiente, que hace que su aplicación leer o modificar archivos que el atacante no puede acceder directamente a . Lo mismo aplica si su programa se está ejecutando con privilegios elevados y acepta nombres de archivo como entrada . Reglas similares se aplican a las URL y al , lo que permite a un usuario externo especificar URL arbitrarias.

que tener cuidado con la URL también, asegúrese de que sea una URL absoluta, externa, de manera que no pueden utilizar su propio servidor web para copiar un archivo confidencial fuera de la LAN a cabo en un área en la que pueden tener acceso, ya que' Estaré cargando esa URL del código que se ejecuta en su servidor web.

+0

Gracias, utilizaré una expresión regular para asegurarme de que no proviene de mi dominio (o de una ruta relativa). La base de datos mantendrá el enlace a la imagen, no a la imagen en sí (para aquellos que simplemente envían enlaces a la URL y no cargan una imagen) – keyboardP

+0

Para archivos cargados, recomiendo guardar la Guía que asignó al archivo en lugar del 'enlace a la imagen '(por la cual supongo que te refieres a la' ruta UNC a la imagen ') en la base de datos. De esta forma, puede adoptar fácilmente un esquema de directorio de almacenamiento de imágenes diferente más adelante, por ejemplo, subdirectorios basados ​​en dividir el guid en trillizos para evitar tener demasiados archivos en un directorio. –

4

Este es un campo de minas absoluto. Algo para tener en cuenta (no necesariamente una lista exhaustiva, sin garantías, etc.).

  • Algunas personas usan expresiones regulares para el análisis sintáctico, por lo que no hay forma de saber si el archivo contiene código. Los archivos ZIP tienen su directorio al final. Sun/Oracle Java PlugIn/WebStart ahora verifica que el archivo comience con un encabezado local ZIP/número mágico de entrada para evitar los ataques "GIFAR".
  • Sirva desde un dominio diferente, para evitar problemas del mismo origen.
  • Sirva desde una dirección IP diferente, para evitar problemas con el mismo origen.
  • Es un poco complicado comprobar si el archivo está explotando, por ejemplo, un desbordamiento de búfer de 0 días. Incluso podría explotar un ciclo infinito para crear un DoS.
  • Lo mejor es volver a codificar la imagen.
  • Cuidado con el nombre de ruta URL/archivo. Si le da una opción, use la verificación de lista blanca. En particular, los caracteres NUL son "divertidos". Ver también ataques cruzados de directorio. En general, poder colocar un archivo de contenido dado en una ubicación conocida es, al menos, un gran error.
  • O puede que las imágenes quieran comprobar que el tamaño es correcto. Descomprimir una imagen enorme podría conducir a un DoS. También tenga en cuenta que los algoritmos de compresión a menudo permiten comprimir datos triviales por factores enormes.
+0

Gracias. En este momento, solo puedo almacenar imágenes en el mismo sistema de servidor. Sin embargo, me complace manipular la imagen de todos modos antes de mostrarla al usuario. ¿Esto mitigaría los principales problemas? Gracias – keyboardP

+0

@TenaciousImpy: En mi opinión sin reservas: si eres lo suficientemente oscuro, probablemente salgas con la re-codificación (posiblemente en una prisión de chroot) y teniendo cuidado con las URL. Tenga en cuenta que es posible configurar un solo servidor con múltiples direcciones IP (multi-homed) y múltiples nombres de host/dominio. Sin embargo, es mejor no tomar mi opinión. –

0

Es posible utilizar Infraestructura como Servicio para la manipulación de imágenes, por ejemplo, nuestra solución - Uploadcare:

https://uploadcare.com

Si se da alguna de la image operations a la imagen cargada, que es modificado, y por lo tanto, se destruirá cualquier código que pueda estar incrustado en el archivo.