Yazar GİRİŞİ

Son eklenen makale ve haberler

  Programlama

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

   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)


Pwm 17.01.2008

co.mments  del.icio.us  digg  Furl  NewsVine  Reddit  Spurl  TailRank  Wists   



Rating : 10 üzerinden 9.50
 



Tümünü Göster / Sadece Başlıklar Yorumlar

che eline sağlık
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.
 
Sinan Eldem tşkler.
bu güzel bir fikir oldu benim için teşekkürler. (sineld)
 
oğuzhan teşekkürler ama çalışmadı
asp de denedim ama çalışmadı ?
mesela ajax la çektiğimiz sayfanın içinde lightbox çalıştırmak istiyorum nasıl yapacağım
 
Pwm ...
Ö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.
 
Kubilay Şengül Ajax ın içinde js çalıştırmak
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ı?
 
Pwm Ajax ın içinde js çalıştırmak
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.
 
anov Güvenlik konusu
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.
 
Pwm Güvenlik konusu
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.
 
mehmet aydın özen form kontrolunde eval()
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?
 
Pwm form kontrolunde eval()
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.
 
mehmet aydın özen form kontrolunde eval()
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.
 
Pwm form kontrolunde eval()
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 ?
 




yorum Yorum ekle
İsminiz:
Mailiniz:
Yorum Konu:
Soru: Gökyüzü ne renktir?
Cevap :
Bütün alanları doldurmanız gerekmektedir.

 
XHTML 1.0 CSS 2.1
Ceviz Reklam