2011-02-14 2 views
1

Dans un contexte de plug-in (swf chargé par un autre swf), existe-t-il un moyen de restreindre l'accès au système de fichiers et au swf chargé?Sécurité: Restreindre l'accès au système de fichiers et au réseau

L'option du compilateur "-use-network = true | false" ne convient pas car vous ne pouvez pas restreindre les fichiers/le réseau.

Exemple de code:

App Air:

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.filesystem.File; 
    import flash.net.URLRequest; 

    public class TestContentSecurity extends Sprite 
    { 
     private var l :Loader = new Loader; 
     public function TestContentSecurity() 
     { 
      addChild(l); 
      l.load(new URLRequest(File.documentsDirectory.nativePath + "/Content.swf")); 
     } 
    } 
} 

swf Loaded:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.system.ApplicationDomain; 
    import flash.text.TextField; 

    public class Content extends Sprite 
    { 
     private var _log : TextField = new TextField; 
     private var l: URLLoader; 
     public function Content() 
     { 
      addChild(_log) 
      _log.multiline = true; 
      _log.width = 500; 
      _log.height = 500; 
      l = new URLLoader(); 
      l.addEventListener(Event.COMPLETE, onLoad); 
      l.addEventListener(IOErrorEvent.IO_ERROR, onError); 
      l.load(new URLRequest("c:/Windows/regedit.exe")) 
     } 

     public function onLoad(e:Event) : void{ 
      _log.text += "SUCCESS\n" ; 
     } 
     public function onError(e:IOErrorEvent) : void{ 
      _log.text += "ERROR\n"; 
     } 
    } 
} 

Le swf chargé est dans le dossier de documents de l'utilisateur, hors du dossier app Air. Actuellement, le swf chargé est capable de charger "c: /Windows/regedit.exe" et je ne le veux pas (ni envoyer d'informations sur le réseau). À moins que vous ne déployiez en tant qu'application AIR.

Répondre

1

J'ai trouvé une solution dans AIR, je ne l'aime pas mais ça marche. L'idée est d'avoir un mini serveur http et de charger du contenu à partir de ce serveur.

je charger le fichier ciblé avec: new URLRequest("http://localhost:1111/Content.swf")

En faisant cela, le flash se charge « Content.swf » comme un fichier distant et le placer dans un bac à sable de sécurité à distance. Swf chargé ne sera pas en mesure d'accéder à des fichiers locaux ni au réseau.

Si quelqu'un a une solution plus propre pour obtenir cette boîte de sable de sécurité REMOTE, je serai heureux.

/** 
* HTTP server original idea : 
* http://coenraets.org/blog/2009/12/air-2-0-web-server-using-the-new-server-socket-api/ 
*/ 
package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.filesystem.File; 
    import flash.filesystem.FileMode; 
    import flash.filesystem.FileStream; 
    import flash.net.URLRequest; 
    import flash.events.Event; 
    import flash.events.ProgressEvent; 
    import flash.events.ServerSocketConnectEvent; 
    import flash.net.ServerSocket; 
    import flash.net.Socket; 
    import flash.utils.ByteArray; 

    public class TestContentSecurity extends Sprite 
    { 
     private var l :Loader = new Loader; 
     private var serverSocket:ServerSocket; 

     public function TestContentSecurity() 
     { 
      init(); 
      l.load(new URLRequest("http://localhost:1111/Content.swf")); 
     } 


     private function init():void 
     { 
      // Initialize the web server directory (in applicationStorageDirectory) with sample files 
      listen(1111); 
     } 

     private function listen(port : uint):void 
     { 
      try 
      { 
       serverSocket = new ServerSocket(); 
       serverSocket.addEventListener(Event.CONNECT, socketConnectHandler); 
       serverSocket.bind(port, "127.0.0.1"); 
       serverSocket.listen(); 
       trace("Listening on port " + port + "...\n"); 
      } 
      catch (error:Error) 
      { 
       trace("Port " + port + 
        " may be in use. Enter another port number and try again.\n(" + 
        error.message +")", "Error"); 
      } 
     } 

     private function socketConnectHandler(event:ServerSocketConnectEvent):void 
     { 
      var socket:Socket = event.socket; 
      socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
     } 

     private function socketDataHandler(event:ProgressEvent):void 
     { 
      try 
      { 
       var socket:Socket = event.target as Socket; 
       var bytes:ByteArray = new ByteArray(); 
       socket.readBytes(bytes); 
       var request:String = "" + bytes; 

       var filePath:String = request.substring(5, request.indexOf("HTTP/") - 1); 
       var file:File = File.applicationDirectory.resolvePath(filePath); 
       if (file.exists && !file.isDirectory) 
       { 
        var stream:FileStream = new FileStream(); 
        stream.open(file, FileMode.READ); 
        var content:ByteArray = new ByteArray(); 
        stream.readBytes(content); 
        stream.close(); 
        socket.writeUTFBytes("HTTP/1.1 200 OK\n"); 
        socket.writeUTFBytes("Content-Type: application/x-shockwave-flash\n\n"); 
        socket.writeBytes(content); 
       } 
       else 
       { 
        socket.writeUTFBytes("HTTP/1.1 404 Not Found\n"); 
        socket.writeUTFBytes("Content-Type: text/html\n\n"); 
        socket.writeUTFBytes("<html><body><h2>Page Not Found</h2></body></html>"); 
       } 
       socket.flush(); 
       socket.close(); 
      } 
      catch (error:Error) 
      { 
       trace("Error"); 
      } 
     } 
    } 
} 
0

Vous pouvez toutefois stocker certaines données dans un SharedObject, même lorsque vous déployez avec -use-network=true. Cela devrait fonctionner pour stocker l'état du jeu et autres.

Modifier:

Dans AIR, la sécurité entre le contenu de différents domaines est réglée à l'aide AIR sandbox bridges. Cela devrait vous donner tout l'effet de levier dont vous avez besoin.

+0

Ce projet est une application AIR mais je ne vois rien qui puisse m'aider. Et je dois interdire l'utilisation du réseau et l'accès local. –

+0

Édité ma réponse. – weltraumpirat

+0

Si une application Air charge un fichier SWF, le fichier chargé peut accéder au système de fichiers ou au réseau, même si je le charge dans un nouveau domaine ApplicationDomain. puis-je changer le réglage de SecurityDoamin? –

Questions connexes