¿Quieres registrarte?

Resolver problemas de seguridad al cargar imágenes en Flash

Por: Zah
7 de Enero del 2009

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().

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas actionscript_3 seguridad flashplayer

Comentarios | Enviar un comentario
Juas! Por un momento o dos, pensé en decirte que escribieras un Tip al respecto o lo haria yo... Al parecer ayudo a que lo hicieras tu primero.
:lol:

Lo bueno es que lo solucionamos pronto, y que se encontró la manera de solucionarlo... Muy buen Tip Zah!
:wink:
Por: M@U
Bueno ahi hice el intento, pero no se no logro que me muestre un pincho error de SandBox para poder probar lo que dicen... estoy cogiendo el content de loader sacando el bitmapdata y esa joda no me muestra el pincho error... Lo hice por que me paso el otro d'ia y lo que hice fue colocar el crossdomail.xml al subdominio.. como siempre digo, eso fijo es algo....

Código :


import flash.display.Loader;

import flash.events.Event;

import flash.display.Bitmap;

import flash.display.BitmapData;

import flash.display.BitmapDataChannel;



var loader:Loader = new Loader (); 

var req:URLRequest = new URLRequest ("http://www.freeimageslive.com/galleries/nature/flora/pics/nature01030.jpg"); 

//var context:LoaderContext = new LoaderContext() 

//context.checkPolicyFile = true; 

loader.load (req);



loader.contentLoaderInfo.addEventListener(Event.COMPLETE, init);



function init(event:Event):void {

   var bmd_:BitmapData = Bitmap(loader.content).bitmapData;

   var seed:int = int(Math.random() * int.MAX_VALUE);

   bmd_.noise(seed, 0, 0xFF, BitmapDataChannel.RED, false);

   this.addChild(new Bitmap(bmd_));

   //this.addChild(loader.content);

}


Por: bipsa
Bispa, según el tip veo que el error solo puede verse con la versión debugger del Flash Player, probaste con eso o directamente con el FlshPlyr común?.
Por: Raxiro-blog
Excelente, gracias, eso me responde muchas inquietudes que tenía al respecto.
Por: Rubencho176-blog
hey esto me sirve, gracias (y)
Por: Otaku RzO
Muy bueno Zah!...a tenerlo en cuenta.

Saludos
Martín Zarzar
Por: Martincho7
¡Muy buen tip Zah!

Me resuelve muchas inquietudes, gracias (y)
Por: fredybg
Ta bien Paja este tuto...
Chevere
Por: Samar-blog
Alguien sabe como lo podria hacer si al lugar de Loader tengo un URLLoader?
Por: claudia-blog
Excelente. Te faltó poner al final:

Lo cual impide desarrollar aplicaciones utilizando imágenes de facebook y pv3d sin utilizar alguna teconología de servidor(como php) que replique las imágenes
Por: Quantium-blog
Gracias Men. por el tip. ya que me funciono sin ningun problema. y para cualquier duda o sugerencia en lo que pueda ayudarles mi correo es beltran.noel@gmail.com
Por: Noel Beltran-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.