Swf Dosyalarını Güvenlik İhlali
Flash ile yapılan uygulamalara harici dosya yüklemek temelde çok basit bir işlemdir. Genelde yapılacak olan işlem yeni bir Loader objesi oluşturup bu objeye yüklenecek materyalin adresini vermektir. Bu işlemin sorunsuz bir şekilde çalışması gerekirken bazen hatalar alabilirsiniz. Özellikle farklı domain adı altından dosyalara erişilmeye çalışıldığında yada aynı domain isminin başına www konulmadığı gibi basit sorunlar sistemi çalışmaz hale getirir. Bunun için bir örnek vermek gerekli diye düşünüyorum; Diyelim ki iki farklı domain adresiniz var ve siz aynı olan dosyaları sadece bir sunucuda tutmak istiyorsunuz.

A sunucusu altındaki swf dosyası B sunucusundaki resim dosyasını kendi içerisinde yüklemeye çalışıyor. A sunucusunun B sunucusuna ulaşıp resim dosyasını yüklemesi için B sunucusu altında crossdomain.xml adlı bir xml dosyasının olması gerekiyor. Bu XML dosyası Flash Player’e bu sunucu altındaki dosyaların hangi sunuculara ait olduğuna dair izin bilgilerini içerir. XML dosyası şu şekildedir;
-
<xml version="1.0">
-
<cross-domain-policy>
-
<allow-access-from domain="*"></allow-access-from>
-
</cross-domain-policy>
-
</xml>
Yukarıdaki örnek XML dosyası tüm sunucuların erişebileceği anlamına geliyor. Eğer sadece bir sunucunun erişmesini istiyorsanız yapmanız gereken yıldız(*) işareti olan yere domain adresini yazmak. Domain adresini yazarken dikkat etmeniz gereken nokta ise;
www.enginyoyen.com
ile
enginyoyen.com
adresinin birbirlerinden farklı algılandığıdır. Yani Flash Player yukarıdaki adres farklı farklı olarak algılayacaktır. Buradaki XML dosyası güvenlik ihlali hatasını çözmeye yeter. Tabii işin kötü tarafı bunun bazı koşullar altında çalışmaması. Yani farklı sunuculardan dosyayı almak için crossdomain.xml dosyası ve izinler ayarlanmıştır. Ama yineden aşağıdaki hatayı alırsınız;
Error #2044: İşlenmemiş securityError:. text=Error #2048: Güvenlik sanal alan ihlali http://enginyoyen.com…..
Peki hatayı gidermenin yolu nedir?
Hatayı gidermenin yolu LoaderContext sınıfını kullanmak. Bu sınıf swf içerisinde harici dosya yükleme seçeneklerini düzenliyor. Yapmanız gereken tek şey bir LoaderContext objesi oluşturup bu objenin checkPolicyFile parametresinin true olarak atamak. Daha sonra ise bu objeyi Loader objesinin load metoduna ikinci parametre olarak vermek;
-
var context:LoaderContext = new LoaderContext();
-
context.checkPolicyFile = true;
-
loader.load(urlReq,context);
Yukarıdaki kodun tam ve çalışır hali şu şekildedir;
-
var context:LoaderContext = new LoaderContext();
-
context.checkPolicyFile = true
-
-
var loader = new Loader ();
-
var urlReq:URLRequest("resim_veya_herhangi_bir_dosya_adresi.jpg");
-
loader.load(urlReq,context);
-
-
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
-
loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler);
-
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
-
-
function openHandler(e:Event) {
-
//dosya yüklenmeye başlandı
-
}
-
function completeHandler(e:Event) {
-
//dosya yüklendi
-
}
-
function ioErrorHandler(e:IOErrorEvent):void {
-
//hata
-
}
-
;
Burada dikkat etmeniz gereken diğer bir durum ise aynı domain adı altında çalışan Flash dosyalarının hata vermesidir. Buradaki en büyük sebep ise domain adlarının iki farklı şekilde girilmesidir;
www.enginyoyen.com
ile
enginyoyen.com
Buda temel olarak güvenlik ihlali sayılıp aynı sunucu altında bile sorun çıkarmaktadır. Bunu çözmek için yukarıdaki yöntemi kullanabilirsiniz.
Kolay Gelsin
Engin!
27 Responses to “Swf Dosyalarını Güvenlik İhlali”
Leave a Reply


iki tane url adresi vermek mümkün değil mi?
İki tane URL adresinden veri çekebilir, ama yukarıdaki işlemi yaparsan hata vermez.
Öncelikle yazılarınız ve dersleriniz için teşekkür ediyorum.
As2 de yapmış olduğum bir çalışma vardı. Bu çalışmada çözemediğim bir hata veriyordu.(güvenlik hatası) Çalışmamın amacı xml dosyasından hostumdaki vdeoları swf içindeki playerda oynatmak.list Component ile listelediğimde çalışıyordu. Verileri kendim listelediğimde şu hatayı veriyor.
*** Güvenlik Sanal Alanı İhlali ***
“http://www.promerdesign.com/oyunlar/video/GTA IV.flv” bağlantısı durduruldu - file:
Maklelinizi okuduktan sonra bir kaç kezdaha denedim çözemedim. crossdomain.xml bu dosyayı tam olarak sunucuda nere atacaz. LoaderContext bu sınıf as2 de çalışıyormu.
Merhaba Engin,
crossdomain.xml dosyasını sunucunun ana dizinine yerleştirmen gerekiyor.
As2 de loadercontext malesef yok, ama sorununu çözmek için şu şekilde bir sistem uygulayabilirsin; bir tane as3 swf dosyası yaratıp o swf dosyasına diğer as2 dosyalarını çağırıp sorunu çözmeyi deneyebilirsin. İşe yarayıp yaramayacağını bilmem ama en azından denemekte fayda var.
xml’den image veri çekerken sorun yaşıyorum. bunu nasıl engelleyebilirim. sizin yukarıda anlattıklaırnız dışında extra’dan ne yapmam gerekiyor.
Merhaba Ahmet,
kullandığın yapısyı ve aldığın sorunu yazarsan eğer sorunu daha kolay bulabiliriz.
Merhaba Engin hocam,
Benim merak ettiğim Loader sınıfında bunu kullanabiliyoruz ama URLLoader ve POST ile veri gönderirken de LoaderContext kullanabilir miyiz?
Merhaba Yağız,
LoaderContext objesini Loader sınıfı içerisinde load() ve loadBytes() metotlarında kullanabiliyorsun.
Kolay gelsin
Ozaman sorumu biraz daha ileri götüreyim.
Bir başka domaindeki PHP dosyasını çalıştırmak için ne yapmamız lazım?
Ben LoaderContext kullanarak bir SWF çektim ve bunun içinde URLLoader kullandım. Çalıştı ama biraz takla attırdım gibi geldi bana
Merhaba Yağız,
mantık aslında aynı, yapman gereken ise crossdomain.xml dosyasını ayarlamak. Flash Player in çalışma mantığı şöyle: Diyelimki a.swf dosyası bulunduğu domainden farklı bir domaine ulaşmaya çalışıyor. Bağlantı sağlanmadan önce Flash Player bağlanılacak olan adresin altındaki crossdomain dosyasını kontrol ediyor. Eğer izin verilmişse bu bağlantıya izin veriyor, eğer izin yoksa o zaman flash player izin vermiyor. Yani işlem flash player tarafından kontrol ediliyor.
“Yani işlem flash player tarafından kontrol ediliyor.” işte aradığım cevap buydu
Teşekkürler.
merhaba engin bey,
benim sorunum sizin yukarıda anlatıldığı gibi ama sorunu cozemedim.
bir video banner yaptım ve bunun flv dosyasını kendi serverımdan host ettim. ama swf dosyası başka bir sitede yayınlanacak. Yani swf nin içindeki flv benim serverımda host edilecek. Ben bu şekilde uyguladım ama maalesef bannerın içinden tıkladığımda flv dosyasını getirmiyor.Serverda mime ayarlarımı yaptım
yardımcı olursanız cok sevinirim.
Merhaba,
yapman gereken kendi sunucuna crossdomain.xml dosyasını eklemen. Bu dosyanın içerisinde yukarıda olduğu gibi ister tüm sitelere izin verirsin istersen sadece tek bir siteye erişim izni verebilirsin.
Eğer bu işlemi doğru yaptığından emin sen, Flash player 10 indirip bilgisayarına yükle, internet tarayıcını açıp ilgili siteyi aç. Aldığın hataya göre ne yapacağını belirlemen daha kolay olur.
Kolay gelsin
Merhaba,ben swf ile ilgili başka bir soru sormak istiyorum.swf yi fullscreen yapmak için fscommand2(”Fullscreen”,true) ve fscommand2(”SetSoftKeys”,Soft1,Soft2) komutlarını kullandım flashlite 2.1 kullanıyorum as2 de..cep telefonunda programda bir tuşa bastığımda fullscreen özelliği gidiyor..tekrar tekrar fullscreen yapmam gerekiyor..yardımcı olabilirmisiniz çok acil gerekiyor
Hocam Eline Sağlık..
Şimdi resim swf vb dosyaları başka sunuculardan bu yöntemle alabiliyoruz dedik. Hatta UILoader Bileşenini kullandığımda kendi kendine herşeyi hallettiğini farkettim geçenlerde. sadece source kısmına adresi giriyorum.
Ancak xml dosyasını hiç bir siteden yükleyemeyecek miyiz? Bunu başaran var mı?.. Lakin bu yöntem belli türler için geçerli gibi gözüküyor. Ve diğer türler için bu yöntem kar etmediği gibi başka bir çözümde ortada yok. Sanırım hiç oluşturulmamış. Flash ile tcmb’den döviz kurlarını çekemiyoruz. ya da kulerden renk kodlarını alamıyoruz.. sanırım önce php’ye yazdırmak gerekiyor kendi sunucumuzda..
Başaran varsa bildirsin lütfen.. Saygılar..
Merhaba Burak,
teoride bahsettiğin bilgileri alamaman için herhangi bir sebep yok. Tabii bilgiyi alacağın sunucuda cross-domain xml tanımlamasının yapılmış olması gerekiyor. Eğer izin verilmiş ise istediğin siteden gerekli bilgileri alabilirsin.
Merhaba Zeynep,
sorunun neden olduğu hakkında bir fikrim yok ama önlemek için cep telefonundaki tuşların laylarını dinleyip yapılacak işlemleri boşa düşürebilirsin. En azından deneyerek çalışıp çalışmama ihtimalini gözden geçirebilirsin.
Merhaba !
Benim de aynı türden sorunum Flex içerisinde var. Aslında yazdığım program, ASP dosyasına istek gönderip, ASP veritabanına bağlanıp sonuçları XML formatına çevirip, XML texti de SWF programıma geri döndürüyor. Ama maalesef SWF dosyası security ile ilgili sorun görüntülüyor. ASP yi broswer da çalıştırdğımda, %100 başarılı çalıştığını görebiliyorum. Sanırım burada içeriğini de yazmış olduğunuz crossdomain.xml dosyasına ihtiyaç var.
localhostte tuttuğum fiziksel adres “c:\inetpub\wwwroot\benimsite” peki ben bu crossdomain.xml i tam olarak buraya mı kopyalamalıyım ?
componenti kullanıyorum. Çözümü flash için değil de flex componentleri ile naısl olabilir, o şekilde anlatırsanız sevinirim.
İyi çalışmalar!
Merhaba Onur,
genelde local testlerde güvenlik hatası vermesi gerekmiyor. Ama dosyayı belirttiğin dizine kopyalaman gerekiyor. Çözümün flex veya falsh ile bir alakası yok, tamamen player ile ilgili.
zaten kitabinizin son sayfasinda da bu konuya el atmistiniz burada da boylelikle daha detayli anlatmissiniz tesekkurler…
1086: Syntax error: expecting semicolon before leftparen.
var urlReq:URLRequest(”resim_veya_herhangi_bir_dosya_adresi.jpg”);
hata aliorum burada
Merhaba Burak;
kodu şu şekilde düzeltmen gerekiyor;
var urlReq:URLRequest = new URLRequest(”resim_veya_herhangi_bir_dosya_adresi.jpg”);
Kolay gelsin
saveAndLoad komutu ile başka bir siteye veri göndermek istiyorum() flash içindeki bir form aracılığı ile fakat ekleyemedim bir türlü.
Direk flash(swf) dosyasını çalıştırırsam sorun olmuyor, fakat html sayfa içinden veri göndermeye çalışırsam gönderemiyorum. Crossdomain dosyasını hazırlayıp ana dizine yükledim(httpdocs içinde),
flash dosyalarıda bu dizinde ama bir türlü veriyi gönderemedim. Sorun ne olabilir?
Engin hocam merhaba,benim sorunumda yukarda Burak Aydın arkadaşımla aynı sekilde,yani döviz kurlarını cekmek istiyorum bi istenin xml sayfasından ama güvenlik ihlali dior ve kurları göstermiyor cektigim sitenin root dizininde crossdomain.xml olmasımı gerekiyor bnun icin? yani benim yapabilecegim bşi yok burumda dogrumu?
çok teşekkürler engin hocam. tamda arayıp bulamadığım şeydi
Merhaba,
HTTPService ile başka bir domainden xml dosyası çekmek istersek nasıl bir davranış izlicez. Bu kısımda benim aklım karıştı biraz.
Merhaba Onur,
başka bir domainden XML dosyası almak için o domain adınını XML kullanımı için izin vermiş olması gerekiyor. Eğer izin verilmiş ise diğer bir deyişle crossdomain.xml dosyası varsa ve bu dosya içerisinde farklı domain adlarının siteden bilgi çekebileceği bilgisi yer alıyorsa XML bilgisini ilgili domain adresinden alabilirsin.