Treść odwołująca się do skryptów w różnych domenach

Adobe AIR 1.0 i starsze wersje

Zainstalowane aplikacje AIR mają specjalne uprawnienia. Bardzo ważne jest, aby te same uprawnienia nie przeciekły do innej treści, np. plików zdalnych lub lokalnych, które nie są częścią aplikacji.

Informacje o moście obszaru izolowanego AIR

W normalnych warunkach treść domen nie może wywoływać skryptów w innych domenach. W celu ochrony aplikacji AIR przed przypadkowym wyciekiem uprzywilejowanych informacji lub elementów sterujących poniższe ograniczenia są umieszczane dla treści w obszarze izolowanym application (treść instalowana z aplikacją):

  • Kod w bezpiecznym obszarze izolowanym aplikacji wywołujący metodę Security.allowDomain() nie ma dostępu do innych obszarów izolowanych. Wywołanie tej metody z bezpiecznego obszaru izolowanego aplikacji spowoduje wygenerowanie błędu.

  • Importowanie treści nieaplikacyjnej do obszaru izolowanego aplikacji poprzez ustawienie właściwości LoaderContext.securityDomain lub właściwości LoaderContext.applicationDomain jest niemożliwe.

Istnieją przypadki, w których główna aplikacja AIR wymaga, aby treść zdalnej domeny miała kontrolowany dostęp do skryptów w głównej aplikacji AIR i odwrotnie. W tym celu środowisko wykonawcze udostępnia mechanizm mostu obszaru izolowanego , który służy jako brama między dwoma obszarami izolowanymi. Most obszaru izolowanego może umożliwiać jawne oddziaływania między zdalnymi obszarami izolowanymi i obszarami izolowanymi aplikacji.

Most obszaru izolowanego prezentuje dwa obiekty, do których mogą uzyskać dostęp skrypty załadowane i ładowane:

  • Dzięki obiektowi parentSandboxBridge treść ładowana może prezentować właściwości i funkcje dla skryptów w treści załadowanej.

  • Dzięki obiektowi childSandboxBridge treść załadowana może prezentować właściwości i funkcje dla skryptów w treści ładowanej.

Obiekty prezentowane za pośrednictwem mostu obszaru izolowanego są przekazywane jako wartość, a nie jako odwołanie. Wszystkie dane są serializowane. Oznacza to, że obiekty zaprezentowane przez jedną stronę mostu nie mogą być ustawiane przez drugą stronę i wszystkie obiekty zaprezentowane nie mają określonych typów. Ponadto możliwe jest prezentowanie tylko prostych obiektów i funkcji; nie można prezentować obiektów złożonych.

Jeśli zawartość potomna próbuje ustawić obiekt na parentSandboxBridge, środowisko wykonawcze generuje wyjątek SecurityError. Analogicznie jeśli zawartość macierzysta próbuje ustawić obiekt na childSandboxBridge, środowisko wykonawcze generuje wyjątek SecurityError.

Przykład mostu obszaru izolowanego (SWF)

Załóżmy, że aplikacja sklepu muzycznego AIR chce zezwolić zdalnym plikom SWF na rozgłaszanie ceny albumów, ale nie chce, aby zdalny plik SWF ujawniał, czy cena jest ceną sprzedaży. Jest to możliwe, ponieważ klasa StoreAPI udostępnia metodę przeznaczoną do określenia ceny, ale przysłania cenę sprzedaży. Następnie instancja tej klasy StoreAPI zostaje przypisana do właściwości parentSandboxBridge obiektu LoaderInfo obiektu Loader, który ładuje zdalny plik SWF.

Poniżej przedstawiono kod sklepu muzycznego AIR:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="Music Store" creationComplete="initApp()"> 
    <mx:Script> 
        import flash.display.Loader; 
        import flash.net.URLRequest; 
     
        private var child:Loader; 
        private var isSale:Boolean = false; 
         
        private function initApp():void { 
            var request:URLRequest =  
                    new URLRequest("http://[www.yourdomain.com]/PriceQuoter.swf") 
 
            child = new Loader(); 
            child.contentLoaderInfo.parentSandboxBridge = new StoreAPI(this); 
            child.load(request); 
            container.addChild(child); 
        } 
        public function getRegularAlbumPrice():String { 
            return "$11.99"; 
        } 
        public function getSaleAlbumPrice():String { 
            return "$9.99"; 
        } 
        public function getAlbumPrice():String { 
            if(isSale) { 
                return getSaleAlbumPrice(); 
            } 
            else { 
                return getRegularAlbumPrice();     
            } 
        } 
    </mx:Script> 
    <mx:UIComponent id="container" /> 
</mx:WindowedApplication> 

Obiekt StoreAPI wywołuje aplikację główną w celu pobrania standardowej ceny albumu, ale wywołanie metody getSaleAlbumPrice() powoduje zwrócenie komunikatu „Not available”. Poniższy kod definiuje klasę StoreAPI:

public class StoreAPI 
{ 
    private static var musicStore:Object; 
     
    public function StoreAPI(musicStore:Object) 
    { 
        this.musicStore = musicStore; 
    } 
 
    public function getRegularAlbumPrice():String { 
        return musicStore.getRegularAlbumPrice(); 
    } 
     
    public function getSaleAlbumPrice():String { 
        return "Not available"; 
    } 
     
    public function getAlbumPrice():String { 
        return musicStore.getRegularAlbumPrice();     
    } 
}

Poniższy kod prezentuje przykład pliku PriceQuoter SWF, który zgłasza cenę sklepową, ale nie zgłasza ceny sprzedaży:

package 
{ 
    import flash.display.Sprite; 
    import flash.system.Security; 
    import flash.text.*; 
     
    public class PriceQuoter extends Sprite 
    { 
        private var storeRequester:Object; 
         
        public function PriceQuoter() { 
            trace("Initializing child SWF"); 
            trace("Child sandbox: " + Security.sandboxType); 
            storeRequester = loaderInfo.parentSandboxBridge; 
             
            var tf:TextField = new TextField(); 
            tf.autoSize = TextFieldAutoSize.LEFT; 
            addChild(tf); 
             
            tf.appendText("Store price of album is: " + storeRequester.getAlbumPrice()); 
            tf.appendText("\n"); 
            tf.appendText("Sale price of album is: " + storeRequester.getSaleAlbumPrice()); 
        } 
    } 
}

Przykład mostu obszaru izolowanego (HTML)

W treści HTML właściwości parentSandboxBridge i childSandboxBridge są dodawane do obiektu okna JavaScript dokumentu podrzędnego. Przykład sposobu konfigurowania funkcji mostu w treści HTML zawiera sekcja Konfigurowanie interfejsu mostu obszaru izolowanego .

Ograniczanie ekspozycji interfejsu API

Podczas prezentowania mostów obszarów izolowanych należy prezentować interfejsy API wysokiego poziomu, które ograniczają stopień wykorzystania mostów. Należy pamiętać, że treść wywołująca implementację mostu może być zmodyfikowania (np. na skutek wstrzyknięcia kodu). Dlatego prezentowanie metody readFile(path:String) (odczytuje treść dowolnego pliku) za pośrednictwem mostu może stanowić zagrożenie. Lepszym rozwiązaniem jest zaprezentowanie interfejsu API readApplicationSetting() , który nie przyjmuje ścieżki i odczytuje określony plik. Podejście bardziej semantyczne może ograniczyć uszkodzenia, jakie aplikacja może spowodować, gdy jej część zostanie zmodyfikowana.