Comunidad de diseño web y desarrollo en internet online

Resolver problemas de seguridad al cargar imágenes en Flash

Flash Player tiene importantes características de seguridad que intentan limitar los posibles usos negativos que se puedan hacer de él, tales como impedir que otros SWFs poco seguros puedan leer variables en nuestra aplicación, prevenir ataques XSS, o simplemente evitar que bugs no detectados puedan resultar peligrosos.

Esto hace que haya que tener muy en cuenta las restricciones de seguridad de las aplicaciones que manejamos, lo cual no es del todo fácil, ya que el tema de seguridad en el Flash Player da para mucho. En esta ocasión cubriré un problema específico que tuvimos en cristalab al cambiar el dominio de los foros, separándolo del del resto del sitio (pasando de cristalab.com/foros a foros.cristalab.com).

Cuando intentábamos acceder a este tip de M@U desde la nueva url del foro veíamos que saltaba el siguiente error de seguridad, que podía verse con la versión debugger del Flash Player:


SecurityError: Error #2122: Violación de la seguridad Sandbox: LoaderInfo.content: http://www.cristalab.com/images/tips/actionscript/suavizar-imagenes/smoothRotate.swf## no puede acceder a http://foros.cristalab.com/images/tips/actionscript/suavizar-imagenes/Example.jpg. Se requiere un archivo de política, pero el indicador checkPolicyFile no se definió al cargar este medio.
at flash.display::LoaderInfo/get content()
at smoothRotate_fla::MainTimeline/load_Complete()

Sin embargo, se podía acceder con normalidad desde la url de la sección de tips, y desde el propio SWF, ambos situados en el mismo servidor que la imagen.
Lo primero que hicimos fue añadir un archivo crossdomain.xml, pero vimos que que el error persistía. Así que tocaba leer la documentación al respecto y ver donde más fallaba.

Encontré que Flash permite cargar imágenes desde cualquier dominio, sin que sea necesario un crossdomain. Sin embargo, no permita acceder a la propiedad content del loader, ni formar un objeto BitmapData con la imagen tal como en el tip de M@U. Para eso es necesario el crossdomain.xml, formado tal como se indica aquí. Pero además, tenemos que decirle a flash que busque el archivo de seguridad antes de cargar la imagen, y eso lo hacemos mediante la propiedad checkPolicyFile de un objeto LoaderContext que pasamos como parámetro de loader.load:

Código :

var loader:Loader = new Loader ();
var req:URLRequest = new URLRequest ("http://servidor_externo.com/url_de_mi_imagen.jpg");
var context:LoaderContext = new LoaderContext()
context.checkPolicyFile = true;
loader.load (req , context);


De esta manera nos aseguramos de que al cargar la imagen flash busque un archivo crossdomain.xml que le dé permiso para acceder al bitmap del archivo cargado.

Cabe señalar que esto no es válido para archivos swf, que se manejan mediante Security.allowDomain().

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate