Ç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.
|
|
|