Skripterstellung zwischen Inhalten in unterschiedlichen Domänen

Adobe AIR 1.0 und höher

AIR-Anwendungen erhalten bei der Installation besondere Berechtigungen. Es ist wichtig, dass diese Berechtigungen nicht auf andere Inhalte übergehen, darunter Remote-Dateien und lokale Dateien, die nicht Teil der Anwendung sind.

Die AIR-Sandboxbrücke

Normalerweise kann Inhalt aus anderen Domänen keine Skripts in anderen Domänen aufrufen. Um AIR-Anwendungen vor der versehentlichen Preisgabe von Informationen oder Kontrolle zu schützen, gelten die folgenden Beschränkungen für Inhalte in der Sicherheits-Sandbox application (Inhalte, die mit der Anwendung installiert werden):

  • Code in der Anwendungs-Sandbox kann nicht durch Aufrufen der Security.allowDomain() -Methode mit anderen Sandboxen interagieren. Wenn diese Methode aus der Anwendungs-Sandbox aufgerufen wird, wird ein Fehler ausgegeben.

  • Das Importieren von anwendungsfremden Inhalten in die Anwendungs-Sandbox durch Festlegen der LoaderContext.securityDomain -Eigenschaft oder der LoaderContext.applicationDomain -Eigenschaft wird verhindert.

In einigen Fällen ist es jedoch erforderlich, dass die AIR-Hauptanwendung Inhalten aus einer Remote-Domäne den kontrollierten Zugriff auf Skripts in der AIR-Hauptanwendung ermöglicht oder umgekehrt. Zu diesem Zweck gibt es in der Laufzeitumgebung so genannte Sandboxbrücken , die als Schnittstelle zwischen zwei Sandboxen fungieren. Eine Sandboxbrücke kann die explizite Interaktion zwischen Remote- und Anwendungs-Sandboxen ermöglichen.

Die Sandboxbrücke öffnet zwei Objekte, auf die sowohl geladene als auch ladende Skripts zugreifen können:

  • Das parentSandboxBridge -Objekt ermöglicht, dass ladender Inhalt Eigenschaften und Funktionen für Skripts im geladenen Inhalt öffnet.

  • Das childSandboxBridge -Objekt ermöglicht, dass geladener Inhalt Eigenschaften und Funktionen für Skripts im ladenden Inhalt öffnet.

Objekte, die über die Sandboxbrücke geöffnet werden, werden durch Werte, nicht durch Verweise übergeben. Alle Daten werden serialisiert. Dies bedeutet, dass die von einer Seite der Brücke geöffneten Objekte nicht von der anderen Seite eingestellt werden können und dass geöffnete Objekte nicht typisiert sind. Des Weiteren lassen sich nur einfache Objekte und Funktionen öffnen; Sie können keine komplexen Objekte öffnen.

Wenn untergeordneter Inhalt versucht, eine Eigenschaft des parentSandboxBridge-Objekts festzulegen, gibt die Laufzeitumgebung eine SecurityError-Ausnahme aus. Wenn übergeordneter Inhalt versucht, eine Eigenschaft des childSandboxBridge-Objekts festzulegen, gibt die Laufzeitumgebung eine SecurityError-Ausnahme aus.

Beispiel für eine Sandboxbrücke (SWF)

In einer Musikshop-AIR-Anwendung sollen Remote-SWF-Dateien den Preis der Alben übermitteln, dabei sollen sie aber nicht angeben, ob es sich bei dem Preis um ein Sonderangebot handelt. Zu diesem Zweck stellt eine StoreAPI-Klasse eine Methode bereit, um den Preis anzugeben, der Angebotspreis wird jedoch verborgen. Eine Instanz dieser StoreAPI-Klasse wird der parentSandboxBridge -Eigenschaft des LoaderInfo-Objekts des Loader-Objekts, das die Remote-SWF-Datei lädt, zugewiesen.

Der Code für den AIR-Musikshop sieht folgendermaßen aus:

<?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> 

Das StoreAPI-Objekt ruft die Hauptanwendung auf, um den normalen Albumpreis abzurufen, gibt jedoch „Not available“ (Nicht verfügbar) zurück, wenn die getSaleAlbumPrice() -Methode aufgerufen wird. Mit dem folgenden Code wird die StoreAPI-Klasse definiert:

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();     
    } 
}

Der folgende Code stellt ein Beispiel einer PriceQuoter-SWF-Datei dar, die den Preis meldet, den Angebotspreis jedoch nicht melden kann:

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()); 
        } 
    } 
}

Beispiel für eine Sandboxbrücke (HTML)

Bei HTML-Inhalt werden die parentSandboxBridge -Eigenschaft und die childSandboxBridge -Eigenschaft dem JavaScript-window-Objekt eines untergeordneten Dokuments hinzugefügt. Ein Beispiel für das Einrichten von Brückenfunktionen in HTML-Inhalt finden Sie unter Einrichten einer Schnittstelle für Sandbox-Brücken .

Begrenzen der API-Öffnung

Beim Öffnen von Sandboxbrücken ist es wichtig, APIs auf hoher Ebene zu öffnen, die den Grad der missbräuchlichen Nutzung einschränken. Beachten Sie, dass der Inhalt, der Ihre Brückenimplementierung aufruft, schädlich sein kann (zum Beispiel durch Einschleusen von Code). Das Öffnen einer readFile(path:String) -Methode (die den Inhalt einer zweifelhaften Datei liest) über die Brücke stellt zum Beispiel ein Risiko dar. Es wäre besser, eine readApplicationSetting() -API zu öffnen, die nicht den Pfad übernimmt und eine bestimmte Datei liest. Der semantischere Ansatz begrenzt den Schaden, den eine Anwendung anrichten kann, wenn ein Teil von ihr schädlich ist.