Skriptning mellan innehåll i olika domäner

Adobe AIR 1.0 och senare

AIR-program ges särskilda behörigheter när de installeras. Det är mycket viktigt att dessa rättigheter inte läcks till annat innehåll, inklusive fjärrfiler och lokala filer som inte är en del av programmet.

Om sandlådebryggan i AIR

Normalt sett kan inte innehåll från andra domäner anropa skript i andra domäner. För att förhindra att AIR-program av misstag läcker konfidentiell information eller kontroll, placeras följande begränsningar på innehåll i programsäkerhetssandlådan (innehåll som installeras med programmet):

  • Kod i programsäkerhetssandlådan kan inte skapa tillåtelser för andra sandlådor genom att anropa metoden Security.allowDomain(). Om den här metoden anropas från programsandlådan returneras ett fel.

  • Det går inte att importera icke-programinnehåll till programsandlådan genom att ange egenskaperna LoaderContext.securityDomain eller LoaderContext.applicationDomain.

Det finns fortfarande fall där huvud-AIR-programmet kräver att innehåll från en fjärrdomän ska ha kontrollerad tillgång till skript i huvud-AIR-programmet, eller vice versa. För att uppnå detta innehåller körtiden en sandlådebrygga-mekanism som fungerar som en brygga mellan de båda sandlådorna. En sandlådebrygga kan skapa explicit interaktion mellan fjärr- och programsäkerhetssandlådor.

Sandlådebryggan visar två objekt som både skript som är inlästa och skript som läses in kan komma åt:

  • Med objektet parentSandboxBridge kan innehåll som läses in visa egenskaper och funktioner för det inlästa innehållet.

  • Med objektet childSandboxBridge kan inläst innehåll visa egenskaper och funktioner för skript i det innehåll som läses in.

Objekt som visas via sandlådebryggan skickas genom värde, och inte referens. Alla data är serialiserade. Detta betyder att de objekt som visas av en sida av bryggan inte kan ställas in från den andra sidan, och att de visade objekten är typlösa. Du kan bara visa enkla objekt och funktioner. Du kan inte visa komplexa objekt.

Om underordnat innehåll försöker ange en egenskap för objektet parentSandboxBridge, utlöser körtiden ett SecurityError-undantag. På samma sätt gäller att om överordnat innehåll försöker ange en egenskap för objektet childSandboxBridge, utlöser körtiden ett SecurityError-undantag.

Exempel på sandlådebrygga (SWF)

Anta att ett AIR-program i form av en musikbutik vill tillåta fjärr-SWF-filer att sända priset på ett album, men att fjärr-SWF-filen inte ska visa om priset är ett reapris eller ej. För att göra detta innehåller en StoreAPI-klass en metod för att hämta priset, men dölja reapriset. En instans av klassen StoreAPI tilldelas sedan egenskapen parentSandboxBridge för LoaderInfo-objektet för det Loader-objekt som läser in fjärr-SWF:en.

Det följande är koden för AIR-musikbutiken:

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

StoreAPI-objektet anropar huvudprogrammet för att hämta standardpriset på albumet, men returnerar ”Inte tillgänglig” när metoden getSaleAlbumPrice() anropas. Följande kod definierar klassen 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();     
    } 
}

Följande kod representerar ett exempel på en PriceQuoter-SWF-fil som rapporterar butikens pris, men som inte kan rapportera reapriset:

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

Exempel på sandlådebrygga (HTML)

För HTML-innehåll läggs egenskaperna parentSandboxBridge och childSandboxBridge till i JavaScript-fönsterobjektet för ett underordnat dokument. Ett exempel på hur du ska konfigurera bryggfunktioner i HTML-innehåll finns under Konfigurera ett gränssnitt för en sandlådebrygga.

Begränsa API-exponering

När du visar sandlådebryggor är det viktigt att visa högnivå-API:er som begränsar den grad som de kan missbrukas på. Kom ihåg att det innehåll som anropar bryggimplementeringen kan vara komprometterat (genom exempelvis kodinjektion). Därför är visning av en readFile(path:String)-metod (som läser innehållet i en godtycklig fil) via en brygga känsligt för missbruk. Det skulle vara bättra att visa ett readApplicationSetting()-API som inte innehåller en sökväg, och som läser en specifik fil. Den mer semantiska inställningen begränsar den skada som ett program kan göra om delar av det blir komprometterade.