Stringleri Kodmuş Gibi Çalıştırmak İçin eval()

AJAX teknolojisinin gelişmesiyle birlikte uzun zamandır köşesinde bekleyen eval() fonksiyonunun önemi anlaşılıyor.  String halindeki kodları çalıştıran bu fonksiyon özellikle AJAX la çekilen verinin javascript kodu olması durumunda kullanılıyor.   Javascriptte bazen değişkenin değeri çeşitli javascript kodlarından oluşabilir ve bu kodları çalıştırmaya ihtiyaç duyabiliriz yada AJAX tan dönen veri sayfada çalıştırılması gereken javascript kodlarından oluşabilir. İlk durum için bir fonksiyon yazmak bizi kurtarabilir. Hatta fonksiyon yazmanın çoğu durumda daha avantajlı olduğu söylenebilir. Ancak ikinci durum için bir fonksiyon yazmak her zaman bizi kurtarmayabilir. İşte o zaman eval() imdadımıza koşar.

   Öncelikle eval() nedir ? Nasıl kullanılır bir inceleyelim.
   eval() değişkenin değerini bir javascript kodu gibi çalıştırır dediğimize göre öncelikle içinde javascript kodları bulunan bir değişkene ihtiyacımız olacak.

var calistirilacak = "alert(\"Merhaba Ceviz\")"

   Bu değişkeni çalıştırmak içinse yapmamız gereken tek şey eval() in içine değişkenimizin adını yazmak

eval(calistirilacak)

   Böyle bir kodu sayfanızda kullandığınızda içinde ‘Merhaba Ceviz’ yazan bir uyarı kutusu çıkacaktır. Sizinde gördüğünüz gibi bu kadar basit bir iş için bile fazlasıyla uğraştık. Belki artık ‘Merhaba Ceviz’ yazmak için sadece eval(calistirilacak) yazmamız bir avantaj ama aynı işi direk alert kullanarakta yapabiliriz. Yine de art arda bir kaç kez çalışacak bir kodu değişken içine yerleştirip eval ile çağırabiliriz ancak aynı işi fonksiyonlar çok daha iyi yapacaktır ve ilerde olası bir değişiklik için fonksiyonlar bize daha rahat bir çalışma imkanı verecektir. Görüldüğü gibi böyle bir işte eval() çok işimize yaramadı zaten AJAX ın olmadığı durumlarda genellikle eval() den iyi alternatifler bulunur.

   Şimdi işin içine AJAX girince eval() in bize getirdiği kolaylıklara bir bakalım.
   Şöyle bir senaryomuz olsun. Sitenizde nadir kullandığınız ama olmazsa olmaz bir javascript fonksiyonu var. Sitenizin hızlı açılması için bu fonksiyonu eğer gerekirse AJAX la sonradan sayfaya dahil etmek istiyorsunuz. Hemen aklınıza kodu sunucudan çekip bir DIV in içine yazmak geliyor. Böylece kodu sonradan ekleyip kullanabileceksiniz ama bu şekilde yapınca fonksiyonunuzun_adi is not defined şeklinde bir hata alıyorsunuz. Oysa bu işi eval() ile yapabilirsiniz hemde daha kolay bir şekilde. Bir örnek yapalım.

index.html

var XHttp, a_func //XHttp -> XMLHttpRequest nesnesi, a_func -> AJAX ile çekeceğimiz kodları saklayacağımız değişken

//Normalde XMLHttpRequest nesnesi oluşturulurken try-catch bloğu kullanılır ancak bu bloğu bilmeyenler olabileceğinden bu şekilde nesneyi oluşturdum.
if(navigator.appName == "Microsoft Internet Explorer")
    {
    XHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
    XHttp = new XMLHttpRequest();
    }

function veri_gonder()
    {
    XHttp.open(‘get’, ‘processor.php’)
    XHttp.onreadystatechange = function ()
        {
       if(XHttp.readyState == 4)
            {
            a_func = XHttp.responseText
            eval(a_func)
           
            //eval(XHttp.responseText)
            //m_ceviz()    
            }
        }
    XHttp.send(null)
    }


processor.php

<?php
echo("alert(\"Merhaba Ceviz \")");
//echo("function m_ceviz(){alert(\"Merhaba Ceviz\")}");
?>



Kodlarda görüldüğü gibi 2 temel şekilde yapılabilinir ancak ikincisinde eval(XHttp.responseText) deyince m_ceviz() fonksiyonunu yalnızca XHttp.onreadystatechange içinde çalışır.(bknz. Kapsam [Scope]) Bunların dışında bir nesne oluşturup fonksiyonları o nesnenin bir metodu haline getirmekte yapılabilinecekler arasında.

Burak YÜCESOY(Pwm)

Arama Terimleri:

eval nedir, ajax EVAL, eval içinde sorgu, ajax eval nedir, gauss eliminasyonu c program, kubilay şengül, <%#eval ne işe yarar, javascript ajax eval, java script eval ne işe yarar, itü c programing paralel port projeler

Benzer Konular:

  • Simply Ajax JS Library AJAX (İngilizce:Asynchronous JavaScript and XML), İnternet sayfalarında JavaScript ve XMLHttpRequest kullanımı ile etkileşimli uygulamalar yaratan tekniğin adıdır.Birçok site bu tekniği...
  • Anthem kütüphanesini tanıyalım 2 – asp.net ajax yazıları 1 Numaralı yazıda bulup kurmuştuk, şimdi kullanımı üzerinde bazı püflerle devam ediyoruz.Anthem i kullanmaya başladıysanız ve örneklerini incelediyseniz, kullanımının ne...
  • civciv-lib 0.0.2 ile gelismis javascript uygulamalari civciv-lib’in yeni versiyonunda bulunan $a (getElementsByAttribute), $c (cookie), $n (navigator), $element, $timer, $wysiwyg, $include fonksiyonlarini detayli aciklama ve orneklerle inceleyelim.Dokumanin...
Yazar - 17 Ocak 2008. Kategori PROGRAMLAMA. Bu yazıya yazılan yazıları RSS üzerinden takip edebilirsiniz RSS 2.0. Yorum yazabilir veya geri izlemede bulunabilirsiniz.

"Stringleri Kodmuş Gibi Çalıştırmak İçin eval()" için yapılan toplam yorum - 12

  1. iyi güzel,fakat javascript içinde bir döngü varsa bahsettiğiniz şekilde eval işe yaramayacaktır.Forumda bu konuda bir kaç çözüm var. Yani döngülerle birlikte javascript kodlarını çalıştırabiliriz.Dediğim gibi sadece eval ile bütün içeriği çalıştırma süzgecinden geçirmek doğru değil.

  2. bu güzel bir fikir oldu benim için teşekkürler. (sineld)

  3. asp de denedim ama çalışmadı ?
    mesela ajax la çektiğimiz sayfanın içinde lightbox çalıştırmak istiyorum nasıl yapacağım

  4. Öncelikle gecikme için hepinizden özür diliyorum. şimdi sorulara cevap vereyim.

    @che
    Evet eval() ile gelen tüm veriyi çalıştırmak doğru değil. Çünkü gelen veride sadece Javascript kodu olmak zorunda değil. Bu yüzden gelen verileri önce ayıklamalıyız. Ben bu tarz durumlar için Javascript kodlarının başlangıcına ve sonuna özel karakterler koyup daha sonra sadece bu karakterlerin içindeki kodları çalıştırıyorum. Onun dışında eval() döngüleride çalıştırabiliyor. Mesela yukadaki örnekte sadece PHP dosyasını değiştirerek bir for döngüsü yapalım.

    echo(“for(i=0; i<5; i++){alert(i);}”);

    While döngüsü içinse;

    echo(“abc = 0;while(abc < 1){alert(abc);abc++;}”);

    kullanılabilinir.

    @oğuzhan
    ASP yi çok iyi bilmiyorum ama problemin daha çok işin Javascript tarafıyla ilgili olduğunu düşünüyorum. Çünkü ASP nin yapacağı tek iş kodu ekrana basmak. Yine de ASP nin ekrana bastığı kodu iyice gözden geçir. Eğer benim gibi tüm komutları tek satıra yazıyorsan komutların sonlarına ; koy. Kodu görmeden söyleyebileceklerim bunlar. Kullandığın kodu yazarsan daha fazla yardımcı olabilirim.

  5. Kubilay şengül

    Pwm
    belki de derdimin dermanı sendedir. Ajax la çağırdığım bir sayfanın içinde javascript ile fotoğraf efektleri vermek istiyorum ama ajax ın içinde js çalışmıyor. iframe ile bu mümkün ama o da fotoğrafların büyüklüğü bakımından uygun olmuyor. Her yerde araştırdım ama pek bi cevabını bulamadım. bu eval() ajax ın içinde js çalıştırmaya yarar mı?

  6. Evet AJAX ile gelen veriyide Javascript olarak çalıştırabilirsin. Tek yapman gereken gelen verinin içindeki javascript kodlarını ayıklayıp eval() den geçirmek.

  7. Güvenlik konusunda saldırganın nasıl bir tehdit oluşturduğunu anlayamadım. Sonuç olarak eğer php/asp dosyasından çektiğimiz bir javascript fonksiyonuysa tüm çalışması client taraflı olacaktır. Yapacağı tüm eylemler sadece kendi bilgisayarında çalışacağı için bu gibi bir eylemin sayfanın kaynak kodunu değiştirip pc de saklamak gibi bir eylem olacaktır.
    Fonksiyon değilde bir veriyse zaten bizim için sakıncalı olan bir şeyi veritabanından hiç çekmeyiz. Saldırgan da javascript ile bir veritabanı sorgusu gönderemeyeceğine göre bu açıdan bir problem olmamalı.
    Son olarak aklıma gelen saldırganın AJAX çağrısını kendi sunucusuna yapması ki böyle bir duruma zaten XMLHttpRequest nesnesi izin vermeyecektir.
    Acaab aklıma gelmeyen başka bir ihtimal mi var. Bu konuda beni aydınlatırsanız sevinirim.

  8. Normal ajax kütüphaneleri, eğer çağrı yanıtı olarak json dönüyorsa bu veriyi eval() içinden geçirip öyle almak zorundadırlar. Ama bu ajax tabanlı bir uygulamayı kötüye kullanmak isteyen veya o sisteme saldırmak isteyen bir saldırgan için arayıp da bulamadığı bir nimete dönüşebilir.

    Dönen kodda, veriyi sona erdirecek karakterleri javascript için özel anlam taşımaz hale getirmezsek, örneğin bir küme parantezi, veya tek tırnak kolaylıkla bizim kendi yazdığımız “öz evalimiz” gidip saldırganın xss enjekte ettiği bir sayfaya veya veritabanı çağrısı yanıtına dönüşebilir.

    Bazı karakterleri engellemek çözüm gibi görünse de bu engelleme pratiğinin aynısını sql injection ataklarında da yaşadık. Hep bunu aşmanın bir yolu bulunuyor. Tıpkı parametreli sorgu kullanmayıp, sql kodunu string toplamalardan oluşturur gibi bir yöntem izliyoruz, bu konudan acaba nasıl korunabiliriz. Aklıma sadece gelen tüm veriyi uygun regexp lerden geçirmek geliyor ama o zaman da izin verdiğimiz her şeyi tek tek belirtmek ve regexp in “su sızdırmaz” olduğundan emin olmak zorundayız.

  9. mehmet aydın özen

    bir form var ve inputa giriş yapıldığında ajax ile veritabanında varsa yanında “var” yoksa “tamam” yazıyor buraya kadar tamam. yapmak istediğim ajax ile çektiğim kontrol.php dosyasında eğer durum “var” olursa forum submitinin valuesinin değişmesi. direkt olarak php dosyasına javascript yazınca çalışmıyor.gösterdiğiniz gibi responsetext e eval koyuncada diğer sayfalar yuklenmiyor.illa o kontrol için yeni fonksiyonmu koymam lazım?

  10. a_func = XHttp.responseText
    eval(a_func)

    kodu yukardaki gibi değil de şöyle yazarsanız yeni bir fonksiyon tanımlamadan direk kodu çalıştırırsınız.

    eval(XHttp.responseText)

    diğer sayfaların yüklenmemesi kısmını tam anlayamadım.

  11. mehmet aydın özen

    ben de uzatmadan öyle yazmıştım ztn..
    aynı fonksiyonlarla tüm ajax işlemlerini yapıyorum, eval() eklediğimde diğer işlemler çalışmıyor.linke tıkladığımda div içine sayfayı getirmiyor yani.

  12. eval() in böyle bir yan etkisi yok diye biliyorum. Acaba eval() ile çalıştırdığınız kodlarda bir çakışma veya başka bir problem olabilir mi ?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>