Farklı etki alanlarındaki içerikler arasında komut dosyası oluşturma

Adobe AIR 1.0 ve üstü

AIR uygulamaları yüklendiklerinde, özel ayrıcalıklara sahip olurlar. Aynı ayrıcalıkların uygulamanın parçası olmayan uzak dosyalar ve yerel dosyalar dahil diğer içeriğe verilmemesi önemlidir.

AIR sanal alan köprüsü hakkında

Etki alanlarında yer alan içerik, normalde diğer etki alanlarında yer alan komut dosyalarını çağıramaz. AIR uygulamalarını ayrıcalıklı bilgi veya kontrolün yanlışlıkla verilmesinden korumak için, application sanal alanındaki içeriğe (uygulamayla yüklenen içerik) aşağıdaki kısıtlamalar yerleştirilmiştir:

  • Uygulama güvenlik sanal alanındaki kod, Security.allowDomain() yöntemini çağırarak diğer sanal alanlara izin veremez. Bu yöntemin uygulama güvenlik sanal alanından çağrılması hata oluşturur.

  • Uygulama dışı içeriğin LoaderContext.securityDomain veya LoaderContext.applicationDomain özelliği ayarlanarak uygulama sanal alanına aktarılması engellenir.

Yine de AIR uygulamasının ana AIR uygulamasındaki komut dosyalarına denetimli erişime sahip olmak için uzak bir etki alanından içerik istediği, veya tam tersi durumlar olur. Çalışma zamanı, bunu gerçekleştirmek için iki sanal alan arasında ağ geçidi olarak görev yapan bir sanal alan köprüsü mekanizması sağlar. Bir sanal alan köprüsü, uzak ve uygulama güvenlik sanal alanları arasında açık etkileşim sağlar.

Sanal alan köprüsü, hem yüklenmiş hem de yüklenen komut dosyalarının erişebileceği iki nesne gösterir:

  • parentSandboxBridge nesnesi, yüklenen içeriğin yüklenmiş içerikteki komut dosyalarına özellikler ve işlevler göstermesini sağlar.

  • childSandboxBridge nesnesi, yüklenmiş içeriğin yüklenen içerikteki komut dosyalarına özellikler ve işlevler göstermesini sağlar.

Sanal alan köprüsü yoluyla gösterilen nesneler başvuruya göre değil, değere göre iletilir. Tüm veriler sıralanmıştır. Bu, köprünün bir tarafıyla gösterilen nesnelerin diğer tarafıyla ayarlanamayacağı anlamına gelir ve gösterilen tüm nesneler türsüzdür. Ayrıca, yalnızca basit nesneler ve işlevleri gösterebilirsiniz; karmaşık nesneleri gösteremezsiniz.

Alt içerik bir nesneyi parentSandboxBridge nesnesine ayarlamaya çalıştığında, çalışma zamanı bir SecurityError istisnası atar. Benzer şekilde, üst içerik bir özelliği childSandboxBridge nesnesine ayarlamaya çalıştığında, çalışma zamanı bir SecurityError istisnası atar.

Sanal alan köprüsü örneği (SWF)

Bir AIR müzik deposu uygulamasının albümlerin fiyatını yayınlamak için uzak SWF içeriğine izin vermek istediğini, ancak uzak SWF dosyasının fiyatın sağış fiyatı olup olmadığını açıklamasını istemediğini düşünün. Bu amaçla, StoreAPI sınıfı fiyatı elde etmek için bir yöntem sağlar, ancak satış fiyatını saklı tutar. Daha sonra StoreAPI sınıfının bir örneği, uzak SWF'yi yükleyen Loader nesnesinin LoaderInfo nesnesine ait parentSandboxBridge özelliğine atanır.

Aşağıdaki, AIR müzik deposuna ilişkin koddur:

<?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 nesnesi, normal albüm fiyatını elde etmek için ana uygulamayı çağırır, ancak getSaleAlbumPrice() yöntemi çağrıldığında “Yok” mesajını döndürür. Aşağıdaki kod StoreAPI sınıfını tanımlar:

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

Aşağıdaki kod, depo fiyatını bildiren, ancak satış fiyatını bildiremeyen bir PriceQuoter SWF dosyası örneğini temsil eder:

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

Sanal alan köprüsü örneği (HTML)

HTML içeriğinde, parentSandboxBridge ve childSandboxBridge özellikleri alt belgenin JavaScript pencere nesnesine eklenir. HTML içeriğinde köprü işlevlerinin nasıl kurulacağına ilişkin bir örnek için bkz. Sanal alan köprü arabirimini kurma .

API pozlamasını sınırlama

Sanal alan köprüleri pozlanırken, kötüye kullanma derecesini sınırlayan üst düzey API'ler göstermek önemlidir. Köprü uygulamanızı çağıran içeriğin ödün verilmiş bir içerik olabileceğini aklınızda bulundurun (örneğin kod yerleştirmesi yoluyla). Bu nedenle, örneğin köprü yoluyla readFile(path:String) yönteminin (rasgele bir dosyanın içeriğini okuyan) gösterilmesi kötüye kullanım için açık oluşturabilir. Bir yol almayan ve belirli bir dosya okumayan readApplicationSetting() API'sinin gösterilmesi daha uygundur. Daha anlamsal bir yaklaşım, bir bölümünden ödün verildiğinde uygulamanın vereceği hasarı sınırlar.