2011-02-14 81 views
1

在插件上下文(由另一个swf加载的swf)中,是否有任何方式限制对加载的swf在同一时间访问文件系统网络?安全:限制插件访问文件系统和网络

编译选项“-use-network = true | false”不适合,因为您不能限制文件/网络。

代码例如:

空气应用

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

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"; 
     } 
    } 
} 

加载的SWF是在用户的文档文件夹中,外部空气的应用程序的文件夹。目前,加载的瑞士法郎能够加载“c:/Windows/regedit.exe”,我不希望它(既不在网络上发送信息)。

回答

1

我在AIR中找到了一个解决方案,我不喜欢它,但它工作。这个想法是有一个迷你http服务器,并从这个服务器加载内容。

我加载有针对性的文件: new URLRequest("http://localhost:1111/Content.swf")

通过这样做,闪存将加载“Content.swf”作为一个远程文件,并将其放置在远程安全沙箱中。加载的swf将不能访问任何本地文件,也不能访问网络。

如果有人有一个更清洁的解决方案来获得这个REMOTE安全沙箱,我会很高兴。

/** 
* 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

除非您将其作为AIR应用程序进行部署。

你可以,但是,存储一些数据在SharedObject,甚至当你部署具有-use-network=true。这应该适用于存储游戏状态等。

编辑

在AIR中,从不同的域内容之间的安全是通过使用AIR sandbox bridges调节。这应该给你所有你需要的杠杆。

+0

这个项目是一个AIR应用程序,但我没有看到任何可以帮助我的东西。我需要禁止网络使用和本地访问。 – 2011-02-14 12:03:03