Безопасность: ограничить доступ плагина к файловой системе и сети - PullRequest
1 голос
/ 14 февраля 2011

В контексте плагина (SWF, загруженный другим SWF), есть ли способ одновременно ограничить доступ к файловой системе и сети к загруженному SWF?

Параметр компилятора "-use-network = true | false" не подходит, поскольку вы не можете ограничить оба файла / сети.

Пример кода:

Air App :

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 находится в папке с документами пользователя, вне папки приложения Air.В настоящее время загруженный SWF-файл способен загружать «c: /Windows/regedit.exe», и я не хочу этого (ни отправка информации по сети).

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Я нашел одно решение в AIR, оно мне не нравится, но оно работает. Идея состоит в том, чтобы иметь мини-http-сервер и загружать контент с этого сервера.

Я загружаю целевой файл с: new URLRequest("http://localhost:1111/Content.swf")

При этом flash загрузит «Content.swf» в качестве удаленного файла и поместит его в удаленную изолированную программную среду безопасности. Загруженный SWF не сможет получить доступ ни к локальным файлам, ни к сети.

Если у кого-нибудь есть более чистое решение для получения этой УДАЛЕННОЙ песочницы для безопасности, я буду счастлив.

/**
 * 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 голосов
/ 14 февраля 2011

Нет, если вы не развернете приложение AIR.

Однако вы можете хранить некоторые данные в SharedObject даже при развертывании с -use-network=true. Это должно работать для сохранения состояния игры и тому подобного.

Редактировать :

В AIR безопасность содержимого из разных доменов регулируется с помощью мостов песочницы AIR . Это должно дать вам все необходимые рычаги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...