Configuración del escalado de imágenes y posible bug de seguridad

17/12/2010       Sergio Raposo Vargas       Programación, Manuales y tutoriales

El sistema de escalado de imágenes de OpenCms nos permite escalar al tamaño más optimo una imagen antes de mostrar, de forma que podemos optimizar las imágenes que mostramos en nuestra web. Por ejemplo, si un usuario sube una imagen de 2MB de tamaño, y una resolución altisima, antes de mostrar dicha imagen en un tamaño de 200px de ancho podremos escalarla para conseguir un tamaño optimizado para el lugar donde lo vamos a mostrar. Podremos generar de esta forma los conocidos thumbnails de manera automática.

La operación de escalado es costosa para el servidor ya que le implica un alto grado de uso de CPU, pero OpenCms cada vez que genera una imagen a escala la guarda en una caché de imágenes lo que permite que en la siguiente petición de la misma imagen ya no tendrá que volver a generarla, tan solo cogerla de dicha caché.

En OpenCms podremos configurar el comportamiento del escalado en el fichero de configuración opencms-vfs.xml. Los parámetros a cnofigurar son:

  • image.scaling.enabled: true | false: Activa o desactiva el escalado de imagenes
  • image.scaling.maxsize: Ej: 1024, 1000, 800 (por defecto 1500). Indica el tamaño máximo al que vamos a permitirle un escalado. Es decir, cuando nos llega una petición de escalado de una imagen se comprueba si el alto o el ancho solicitado supera esta configuración. En el caso que lo supere se devolverá la imagen original sin escalar, sino lo supera se realiza el escalado. Por ejemplo, si la configuración es de 1024 y recibimos la petición: http://your.url/image.jpeg?__scale=w:1000,h:750 la imagen se escala a dicho tamaño, sin embargo, si la petición es http://your.url/image.jpeg?__scale=w:1500,h:1200 no se escala la imagen y se devuelve la original.
  • image.scaling.maxblursize: Ej: 2500*2500 (valor por defecto), 1500*1500, etc... En este caso, este parámetro indica el límite de las imagenes para la que se le aplica el desenfocado. El desenfocado es la operación que se aplica antes de la reducción de la escala para ofrecer más calidad a la reducción. Se basa en difuminar la imagen para que al reducir no se pierda tanta calidad. La acción de desenfocar es muy costosa para la máquina, es decir, si tenemos una imagen muy grande (3000*3000 por ejemplo) al aplicar esta operación es posible que nos quedemos sin memoria y que se produzcan errores de "out of memory". Por lo tanto, este parámetro permite configurar el tamaño máximo de las imagenes a las que se le aplica el desenfocado. Para imagenes superiores a esta se aplicará directamente un escalado que, sigue ofreciendo buenos resultados y no resulta peligroso para el rendimiento del servidor.
  • image.folder: Se utiliza para cambiar la carpeta por defecto donde se exportan las imagenes escaladas. Por defecto: /WEB-INF/imagecache/
  • image.scaling.downscale: Permite configurar la reducción de la escala. EJ: w:500,h:200 (NO HE CONSEGUIDO QUE FUNCIONE)

En la lista de distribución oficial de OpenCms se detectó un posible bug de seguridad que utiliza esta característica de OpenCms para hacer un ataque a nuestros servidores OpenCms. El ataque consiste en hacer infinitas peticiones de escalado de una imagen para todos y cada uno de los posibles tamaños (1x1,1x2,1x3 ...). OpenCms dinámicamente genera la imagen escalandola y la guarda en la caché de imagenes para que la próxima petición no tenga que volver a generarla. Si el número de peticiones es muy grande puede que se llene la caché de imágenes y el servidor se quede sin espacio o incluso que al recibir tantas peticiones el servidor se venga abajo al intentar escalar tantas imágenes.

Posibles soluciones:

Controlar el tamaño máximo a la hora de escalar una imagen, si se pide un escalado superior a ese parámetro no se escala y no se carga el sistema, se asume que con escalados menores a ese parámetro el sistema no tiene porque sufrir para generarlos, y sería trabajo del administrador el de borrar la caché si se recibe este tipo de ataques para que no se llegara a llenar el disco duro.

 

 OpenCms escalado imágenes caché