Intercommunication sécurisée entre swf de domaines différents



Les différentes méthodes

Le chargement au sein de votre application d'un swf provenant d'un domaine différent peut poser quelques problèmes d'intercommunication ou de sécurité. Le comportement par défaut est que la communication est impossible et génère des erreurs. Il existe alors différentes manières de les faire communiquer.

Tout d'abord, l'utilisation de Security.allowDomain permet ainsi d'autoriser la communication entre les deux swf. On peut aussi charger le swf à l'aide d'un fichier de cross-domain et d'un LoaderContext. Cependant ces méthodes ne permettent pas la sécurité dont on peut avoir besoin dans une application. En effet, une fois le swf chargé, il peut accéder aux méthodes, aux propriétés et aux données de votre swf parent, mais peut aussi accéder aux fichiers et cookies stockés sur le domaine parent. Ainsi, si vous voulez créer une communication sûre entre deux swf de domaines différents, il faut utiliser les sharedEvents qui permettent de propager des évènements hors des limites de sécurité.

Voici un exemple, pour une fonction de pause lorsque la souris quitte le stage :

  /* code parent */
  //le swf enfant est supposé chargé...
  var dispatcher:EventDispatcher = loader.contentLoaderInfo.sharedEvents;
  stage.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);

    function onMouseOut(e:MouseEvent):void{
  	//fonction qui met en pause l'application
  	dispatcher.dispatchEvent(e);	//propagation de l'évènement à l'enfant
  }

    /* code enfant */
  var dispatcher:EventDispatcher = loader.contentLoaderInfo.sharedEvents;
  dispatcher.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);

    function onMouseOut(e:MouseEvent):void{
  	//L'enfant peut récupérer l'objet stage
  	//grâce à l'évènement MouseEvent,
  	//puis accéder à votre liste d'affichage
  	//pour y foutre le bronx.
  }
  

Méthode sécurisée pour un swf auquel on ne fait pas confiance

Pour une sécurité accrue, il faut donc propager l'évènement en le substituant par un autre, plus sécurisé ! Il s'agit juste de rediffuser l'évènement avec des propriétés tronquées.

  /* code parent */
  //le swf enfant est supposé chargé...
  var dispatcher:EventDispatcher = loader.contentLoaderInfo.sharedEvents;
  stage.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);

    function onMouseOut(e:MouseEvent):void{
  	//fonction qui met en pause l'application
  	/*MouseEvent(type:String, bubbles:Boolean = true, 
  			cancelable:Boolean = false, localX:Number, localY:Number, 
  						relatedObject:InteractiveObject = null)*/
  	dispatcher.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OUT,true,false,
  							e.localX,e.localY));
  }

    /* code enfant */
  var dispatcher:EventDispatcher = loader.contentLoaderInfo.sharedEvents;
  dispatcher.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);

    function onMouseOut(e:MouseEvent):void{
  	//L'enfant ne peut récupérer aucun interactiveObject,
  	//il ne peut donc accéder à la liste d'affichage.
  }
  

Pour aller plus loin avec les domaines

Je vous suggère la lecture de cet article (en anglais) sur Senocular.

Laissez un commentaire:

blog comments powered by Disqus Comments