¿Cómo inserto de forma segura una etiqueta img utilizando una URL dada por el usuario?

8

Si hipotéticamente quisiera permitir que los usuarios usen un avatar de una URL arbitraria como esta:

<img class="avatar" src="{user input}" />

Hay muchos problemas que se me ocurren:

  • Hay data uris , por lo que potencialmente es posible crear un archivo PDF independiente; ¿Esto realmente funcionaría dentro de una etiqueta <img /> ?
  • Hay una notación de javascript: que funciona para los elementos de <a />
  • Un servidor puede responder con 401 no autorizado y solicitar una autenticación básica, el usuario estaría tentado de probar su propia combinación de usuario / contraseña
  • Un servidor puede devolver una imagen gigantesca

Y probablemente mucho más.

¿Hay alguna forma de hacerlo seguro sin descargar y servir esa imagen?

    
pregunta siergiej 11.05.2015 - 15:41
fuente

1 respuesta

4

Evitar ataques en su sitio

Debe validar que la cadena que recibió es válida. Recuerde este principio: debe incluir en la lista blanca cadenas aceptables en lugar de en la lista negra inaceptables.

  1. Asegúrate de que la cadena sea una URL escapada sintácticamente correcta . Escapar de la URL completa evita que contenga "o > lo que podría romper la sintaxis de su sitio.
  2. Asegúrese de que la URL sea absoluta, para ayudar a evitar ataques transversales de directorios . También deberá averiguar cómo su servidor web maneja los enlaces simbólicos accesibles desde su carpeta /var/www , y cómo su servidor resuelve las URL absolutas con referencias a directorios principales, por ejemplo. www.server.com/../../../etc/passwd .
  3. Asegúrese de que la URL use un protocolo conocido y compatible del que entienda las implicaciones: http o https . ¹

Protegiendo la privacidad de los usuarios

No hay ningún punto a priori para verificar en qué consiste realmente el archivo al que se apunta, ya que el usuario que lo proporcionó puede cambiarlo en cualquier momento sin que usted lo sepa. Si ese código desencadena un error en la rutina de representación del navegador, el proceso del navegador (zona de pruebas) que representa su sitio se verá comprometido.

Debe tener en cuenta que las imágenes se pueden usar para recopilar las direcciones IP de sus propios usuarios. Los atacantes solo tienen que esperar y recopilar qué direcciones IP consultan la imagen que usaron para su sitio.

El ataque 401 debería estar arreglado ahora, pero es posible que algunos navegadores aún no lo manejen correctamente. Se ha discutido en este hilo de StackExchange . Según esta secuencia de seguimiento de errores de Chrome , Chrome ya no muestra un mensaje de autenticación cuando una imagen dispara un error 401.

Hay una solución común para estas dos amenazas: descargar y guardar en caché la imagen . Si puede permitírselo, tendrá una mayor certeza de que los usuarios están seguros. Sé que no es lo que estás pidiendo, pero es tu mejor curso de acción.

¡Evita ataques en tu servidor!

Ya que ahora estás guardando en caché la imagen, debes volver a incluirla en la lista blanca.

  1. Asegúrese de que la imagen corresponda a uno de sus formatos de archivo admitidos (por ejemplo, PNG / SVG / JPG / GIF)
  2. Asegúrese de que la imagen es sintácticamente correcta
  3. Reconstituya las imágenes extrayendo la información relevante para mostrarlas y descargando cualquier información que no reconozca o necesite, por ejemplo, supuestamente, los archivos SVG pueden incrustar JavaScript , lo que es posible que no desee, ya que el navegador lo ejecutaría en su dominio. ²
  4. Imponer límites razonables en la resolución y el tamaño del archivo de la imagen

¹ Se ha señalado que un atacante podría hacer algo como file:///some/user/secret/on/their/local/machine . Si no recuperó el archivo pero simplemente dejó la URL tal como está, esto podría hacer que el proceso de procesamiento que representa su sitio cargue el archivo. Junto con una segunda URL a una imagen que explota con éxito un error en el render, un atacante podría recuperar el contenido de este archivo.

² Tenga en cuenta que los archivos SVG son particularmente peligrosos , y que no hay herramientas disponibles para filtrarlos actualmente.

    
respondido por el Steve DL 11.05.2015 - 16:43
fuente

Lea otras preguntas en las etiquetas