Farklı güvenlik sanal alanlarında çapraz komut dosyası içeriği

Adobe AIR 1.0 ve üstü

Çalıştırma zamanı güvenlik modeli kodu farklı kaynaklardan ayırır. Farklı güvenlik sanal alanlarında içerik için komut dosyası oluşturarak bir güvenlik sanal alanındaki içeriğin diğer sanal alandaki seçilen özellikler ve yöntemlere erişmesini sağlayabilirsiniz.

AIR güvenlik sanal alanları ve JavaScript kodu

AIR, bir etki alanındaki kodun diğer etki alanındaki içerikle etkileşime girmesini engelleyen bir aynı kaynak politikası uygular. Tüm dosyalar, kaynakları temel alınarak bir sanal alana yerleştirilir. Genellikle uygulama sanal alanındaki içerik aynı kaynak ilkesini ihlal edemez ve uygulama yükleme dizininin dışından yüklenen içerik için çapraz komut dosyası oluşturur. Ancak, AIR uygulama dışı içeriğe ilişkin çapraz komut dosyası oluşturmanızı sağlayan birkaç teknik sunar.

Bir teknik, uygulama içeriğini farklı bir güvenlik sanal alanına eşlemek için çerçeveleri veya iframe'leri kullanır. Uygulamanın sanal alanlı bölümünden yüklenen tüm sayfalar, uzak etki alanından yüklenmiş gibi davranır. Örneğin, bu içerik uygulama içeriğini example.com etki alanına yükleyerek example.com'dan yüklenen sayfalar için çapraz komut dosyası oluşturabilir.

Teknik uygulama içeriğini farklı bir sanal alana yerleştirdiğinden, bu içerikte bulunan kod artık değerlendirilen dizelerdeki kod yürütmesine ilişkin kısıtlamalara tabi değildir. Bu sanal alan eşleme tekniğini, uzak içerik için çapraz komut dosyası oluşturmanız gerekmese bile, bu kısıtlamaları kolaylaştırmak için kullanabilirsiniz. İçeriği bu şekilde eşlemek özellikle birden çok JavaScript çerçevesinden biriyle veya dizelerin değerlendirilmesine dayanan mevcut kodla çalışırken kullanışlıdır. Ancak, güvenli olmayan içeriğin uygulama sanal alanı dışında çalışırken yerleştirilip ve yürütülebiliyor olması riskini göz önünde bulundurun ve buna karşı önlem alın.

Aynı zamanda, başka bir sanal alana eşlenen uygulama içeriği AIR API'lerine erişimini kaybeder, bu nedenle sanal alan eşleme tekniği AIR işlevlerini uygulama sanal alanının dışında yürütülen koda göstermek için kullanılamaz.

Diğer bir çapraz komut dosyası oluşturma tekniği, uygulama dışı sanal alandaki içerikle bunun uygulama sanal alanında bulunan üst belgesindeki içerik arasında sanal alan köprüsü adı verilen bir arabirim oluşturmanıza olanak verir. Köprü, alt içeriğin üst içerik tarafından tanımlanan özellikler ve yöntemlere erişmesini, üst içeriğin alt içerik tarafından tanımlanan özellikler ve yöntemlere erişmesini, veya bunların her ikisini sağlar.

Son olarak, uygulama sanal alanından ve isteğe bağlı olarak diğer sanal alanlardan etki alanları arası XMLHttpRequests de gerçekleştirebilirsiniz.

Daha fazla bilgi için, bkz. HTML frame ve iframe öğeleri , Adobe AIR'de HTML güvenliği , ve XMLHttpRequest nesnesi .

Uygulama içeriğini uygulama dışı sanal alana yükleme

Uygulama içeriğinin uygulama yükleme dizininin dışından yüklenen içerik için güvenli biçimde çapraz komut dosyası oluşturmasını sağlamak amacıyla, uygulama içeriğini harici içerikle aynı güvenlik sanal alanına yüklemek için frame veya iframe öğelerini kullanın. Uzak içerik için çapraz komut dosyası oluşturmanız gerekmiyorsa, ancak yine de uygulamanızın bir sayfasını uygulama sanal alanının dışından yüklemek istiyorsanız kaynak etki alanı olarak http://localhost/ veya başka bir zararsız değer kullanın.

AIR, çerçeveye yüklenen uygulama dosyasının uygulama dışı bir sanal alana eşlenmesi gerekip gerekmediğini belirlemenizi sağlayan kare öğesine yeni sandboxRoot ve documentRoot niteliklerini ekler. sandboxRoot URL'sinin altındaki bir yola çözümlenen dosyalar bunun yerine documentRoot dizininden yüklenir. Güvenlik nedenleriyle, bu şekilde yüklenen uygulama içeriği, sandboxRoot URL'sinden yüklenmiş gibi ele alınır.

sandboxRoot özelliği, kare içeriğinin yerleştirileceği sanal alan ve etki alanını belirlemek için kullanılacak URL'yi belirtir. URL şemasının kullanması gereken file: , http: veya https: . İlişkili bir URL belirtirseniz, içerik uygulama sanal alanında kalır.

documentRoot özelliği, çerçeve içeriğinin yükleneceği kaynak dizini belirtir. URL şemasının kullanması gereken file: , app: veya app-storage: .

Aşağıdaki örnek, uygulamanın sandbox alt dizinine yüklenen içeriği uzak sanal alanda ve www.example.com etki alanında çalışacak biçimde eşler:

<iframe 
    src="http://www.example.com/local/ui.html"  
    sandboxRoot="http://www.example.com/local/"  
    documentRoot="app:/sandbox/"> 
</iframe>

ui.html sayfası aşağıdaki komut dosyası etiketini kullanarak yerel sandbox klasöründen bir javascript dosyası yükleyebilir:

<script src="http://www.example.com/local/ui.js"></script>

Ayrıca, aşağıdaki gibi komut dosyası etiketini kullanarak uzak sunucudaki bir dizinden de içerik yükleyebilir:

<script src="http://www.example.com/remote/remote.js"></script>

sandboxRoot URL'si, uzak sunucuda bulunan aynı URL'deki tüm içeriği maskeler. Yukarıdaki örnekte, AIR, isteği yerel uygulama dizinine yeniden eşlediğinden www.example.com/local/ linkindeki (veya onun alt dizinlerinden birindeki) uzak içeriğe erişemezsiniz. İstekler, sayfada gezinmesinden, XMLHttpRequest'ten veya tüm diğer içerik yükleme yöntemlerinden türetilseler de yeniden eşlenirler.

Sanal alan köprü arabirimini kurma

Uygulama sanal alanındaki içeriğin uygulama dışı bir sanal alandaki içerik tarafından tanımlanan özellikler ve yöntemlere erişmesi veya uygulama dışı içeriğin uygulama sanal alanındaki içerik tarafından tanımlanan özellikler veya yöntemlere erişmesi gerektiğinde sanal alan köprüsü kullanmalısınız. Herhangi bir alt belgenin window nesnesine ait childSandboxBridge ve parentSandboxBridge özellikleriyle bir köprü oluşturun.

Alt sanal alan köprüsü oluşturma

childSandboxBridge özelliği, alt belgenin üst belgedeki içeriğe bir arabirim göstermesine olanak verir. Arabirim göstermek için childSandbox özelliğini alt belgedeki bir işleme veya nesneye ayarlarsınız. Böylece nesneye veya işleve üst belgedeki içerikten erişebilirsiniz. Aşağıdaki örnek, alt belgede çalışan bir komut dosyasının bir işlev ve bir özellik içeren nesneyi üst öğesine nasıl gösterdiğini açıklar:

var interface = {}; 
interface.calculatePrice = function(){ 
    return ".45 cents"; 
} 
interface.storeID = "abc" 
window.childSandboxBridge = interface;

Bu alt içerik, “alt” kimliği atanmış bir iframe'e yüklendiyse, karenin childSandboxBridge özelliğini okuyarak üst içerikten arabirime erişebilirsiniz.

var childInterface = document.getElementById("child").contentWindow.childSandboxBridge; 
air.trace(childInterface.calculatePrice()); //traces ".45 cents" 
air.trace(childInterface.storeID)); //traces "abc"

Üst sanal alan köprüsü oluşturma

parentSandboxBridge özelliği, üst belgenin alt belgedeki içeriğe bir arabirim göstermesine olanak verir. Üst belge, arabirim göstermek için alt belgenin parentSandbox özelliğini üst belgede tanımlanmış bir işleve veya nesneye ayarlar. Böylece nesneye veya işleve alt belgedeki içerikten erişebilirsiniz. Aşağıdaki örnek, üst karede çalışan bir komut dosyasının işlev içeren bir nesneyi alt belgeye nasıl gösterdiğini açıklar:

var interface = {}; 
interface.save = function(text){ 
    var saveFile = air.File("app-storage:/save.txt"); 
    //write text to file 
} 
document.getElementById("child").contentWindow.parentSandboxBridge = interface;

Alt karedeki içerik, bu arabirimi kullanarak metni save.txt adlı bir dosyaya kaydedebilir, ancak dosya sistemine bunun dışında herhangi bir erişimi olmayacaktır. Alt içerik saklama işlevini aşağıdaki şekilde çağırabilir:

var textToSave = "A string."; 
window.parentSandboxBridge.save(textToSave);

Uygulama içeriği, diğer sanal alanlara mümkün olan en dar arabirimi göstermelidir. Uygulama dışı içerik, yanlışlıkla veya kötü amaçla kod yerleştirmesine maruz kalabileceğinden yapısı gereği güvenilmez olarak ele alınmalıdır. Üst sanal alan köprüsü aracılığıyla gösterdiğiniz arabirimin hatalı kullanımını engellemek için uygun korumaları yerine koymalısınız.

Sayfa yükleme sırasında üst sanal alan köprüsüne erişme

Alt belgedeki komut dosyasının bir üst sanal alan köprüsüne erişmesi için, köprü komut dosyası çalıştırılmadan kurulmalıdır. Yeni bir sayfa DOM'u oluşturulduğunda, ancak herhangi bir komut dosyası ayrıştırılmadan veya DOM öğeleri eklenmeden pencere, kare ve iframe bir dominitialize olayı gönderir. Sayfa yapım sırasında, köprüyü alt belgedeki tüm komut dosyalarının erişebileceği kadar erken oluşturmak için dominitialize olayını kullanabilirsiniz.

Aşağıdaki örnek, alt kareden gönderilen dominitialize olayına karşılık olarak üst sanal alan köprüsünün nasıl oluşturulacağını gösterir:

<html> 
<head> 
<script> 
var bridgeInterface = {}; 
bridgeInterface.testProperty = "Bridge engaged"; 
function engageBridge(){ 
    document.getElementById("sandbox").contentWindow.parentSandboxBridge = bridgeInterface; 
} 
</script> 
</head> 
<body> 
<iframe id="sandbox" 
            src="http://www.example.com/air/child.html"  
            documentRoot="app:/" 
            sandboxRoot="http://www.example.com/air/" 
            ondominitialize="engageBridge()"/> 
</body> 
</html>

Aşağıdaki child.html belgesi, alt içeriğin üst sanal alan köprüsüne nasıl erişebileceğini gösterir:

<html> 
    <head> 
        <script> 
            document.write(window.parentSandboxBridge.testProperty); 
        </script>   
    </head>   
    <body></body> 
</html>

Kare yerine alt penceredeki dominitialize olayını dinlemek için dinleyiciyi window.open() işleviyle oluşturulan yeni alt window nesnesine eklemelisiniz:

var childWindow = window.open(); 
childWindow.addEventListener("dominitialize", engageBridge()); 
childWindow.document.location = "http://www.example.com/air/child.html";

Bu durumda, uygulama içeriğini uygulama dışı bir sanal alana eşlemenin yolu yoktur. Bu teknik, yalnızca child.html öğesi uygulama dizininin dışından yüklendiğinde kullanışlıdır. Yine de penceredeki uygulama içeriğini uygulama dışı bir sanal alana eşleyebilirsiniz, ancak öncesinde alt belgeyi yüklemek ve bunu istenen sanal alana eşlemek için kendisi çerçeveler kullanan bir ara sayfa yüklemelisiniz.

Pencere oluşturmak için HTMLLoader sınıfının createRootWindow() işlevini kullandığınızda, yeni pencere createRootWindow() öğesinin çağrıldığı kaynak belgenin alt öğesi değildir.. Bu nedenle, çağıran pencere ve yeni pencereye yüklenen uygulama dışı içerik arasında sanal alan köprüsü oluşturamazsınız. Bunun yerine, alt belgeyi yüklemek için kendisi çerçeveler kullanan yeni pencereye bir ara pencere yükleme işlevini kullanmalısınız. Yeni pencerenin üst belgesi ve kareye yüklenen alt belge arasında köprü oluşturabilirsiniz.