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.

Farklı sunuculardan dosya yüklemek

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;

  1. <xml version="1.0">
  2. <cross-domain-policy>
  3. <allow-access-from domain="*"></allow-access-from>
  4. </cross-domain-policy>
  5. </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;

  1. var context:LoaderContext = new LoaderContext();
  2. context.checkPolicyFile = true;
  3. loader.load(urlReq,context);

Yukarıdaki kodun tam ve çalışır hali şu şekildedir;

  1. var context:LoaderContext = new LoaderContext();
  2. context.checkPolicyFile = true
  3.  
  4. var loader =  new Loader ();
  5. var urlReq:URLRequest("resim_veya_herhangi_bir_dosya_adresi.jpg");
  6. loader.load(urlReq,context);
  7.  
  8. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
  9. loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler);
  10. loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
  11.  
  12. function openHandler(e:Event) {
  13. //dosya yüklenmeye başlandı
  14. }
  15. function completeHandler(e:Event) {
  16. //dosya yüklendi
  17. }
  18. function ioErrorHandler(e:IOErrorEvent):void {
  19. //hata
  20. }
  21. ;

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”

  1. emrah atılkan 25 November 2008 at 00:23 #

    iki tane url adresi vermek mümkün değil mi?

  2. Engin Yöyen 25 November 2008 at 00:40 #

    İki tane URL adresinden veri çekebilir, ama yukarıdaki işlemi yaparsan hata vermez.

  3. Engin Gündoğdu 23 December 2008 at 12:59 #

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

  4. Engin Yöyen 25 December 2008 at 21:34 #

    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.

  5. ahmet 19 March 2009 at 09:45 #

    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.

  6. Engin Yöyen 25 March 2009 at 08:45 #

    Merhaba Ahmet,
    kullandığın yapısyı ve aldığın sorunu yazarsan eğer sorunu daha kolay bulabiliriz.

  7. Yağız Gürgül 4 April 2009 at 21:03 #

    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?

  8. Engin Yöyen 7 April 2009 at 02:12 #

    Merhaba Yağız,
    LoaderContext objesini Loader sınıfı içerisinde load() ve loadBytes() metotlarında kullanabiliyorsun.
    Kolay gelsin

  9. Yağız Gürgül 7 April 2009 at 15:42 #

    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 :)

  10. Engin Yöyen 8 April 2009 at 08:05 #

    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.

  11. Yağız Gürgül 12 April 2009 at 09:01 #

    “Yani işlem flash player tarafından kontrol ediliyor.” işte aradığım cevap buydu :)

    Teşekkürler.

  12. taylan kurt 21 July 2009 at 12:25 #

    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.

  13. Engin Yöyen 21 July 2009 at 18:51 #

    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

  14. zeynep ayhan 4 August 2009 at 08:18 #

    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 :(

  15. Burak AYDIN 6 August 2009 at 02:29 #

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

  16. Engin Yöyen 11 August 2009 at 08:32 #

    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.

  17. Engin Yöyen 11 August 2009 at 08:50 #

    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.

  18. Onur Olce 19 August 2009 at 09:09 #

    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!

  19. Engin Yöyen 24 August 2009 at 19:23 #

    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.

  20. fatihdu77 17 September 2009 at 11:11 #

    zaten kitabinizin son sayfasinda da bu konuya el atmistiniz burada da boylelikle daha detayli anlatmissiniz tesekkurler…

  21. Burak 9 February 2010 at 01:43 #

    1086: Syntax error: expecting semicolon before leftparen.

    var urlReq:URLRequest(”resim_veya_herhangi_bir_dosya_adresi.jpg”);

    hata aliorum burada

  22. Engin Yöyen 9 February 2010 at 09:20 #

    Merhaba Burak;
    kodu şu şekilde düzeltmen gerekiyor;
    var urlReq:URLRequest = new URLRequest(”resim_veya_herhangi_bir_dosya_adresi.jpg”);

    Kolay gelsin

  23. Mustafa 10 March 2010 at 00:43 #

    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?

  24. soner 20 April 2010 at 16:51 #

    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?

  25. ismail 12 May 2010 at 02:22 #

    çok teşekkürler engin hocam. tamda arayıp bulamadığım şeydi :)

  26. Onur 18 May 2010 at 09:54 #

    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.

  27. Engin Yöyen 2 June 2010 at 10:28 #

    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.


Leave a Reply