2010-07-26 16 views
6
var foo = "function(){ alert('meee'); }"; 
foo(); 

Yukarıdakileri denedim ama işe yaramıyor, bu işlevi kullanmadan başka bir şekilde değerlendirme yapmanıza gerek yok mu?javascript işlevi için bir dize değiştirme (değerlendirme değil)

thnx

+0

Sorunuzla ilgili daha spesifik olabilirseniz, muhtemelen bu yaklaşımı değerlendirmeye ihtiyaç duymadığınız bir alternatif vardır. – rfunduk

+0

well 'function() {alert ('mee');}' yakalamayı başarabilen bir metin şu anda bu fonksiyonu çağırmam gerekiyor ... bence yukarıdaki örnek php üzerinde çalışıyor, muhtemelen bu fikri nasıl aldım ... böylece fonksiyon bir 'iç html'den alınmıştı bu yüzden bir metin olacağını düşündüm. – Val

cevap

8

Eğer doğrudan Function yapıcı kullanmak istiyorum. Tüm argümanlar dizelerdir. Son argüman fonksiyonun gövdesidir, herhangi bir önde gelen argüman fonksiyonun aldığı argümanların isimleridir.

Anders' örnekten deyimine göre

,

var multiply = new Function("x", "y", "return x * y"); 

Senin durumunda

var multiply = function (x,y) { 
    return x * y 
} 

yazmak gibi olurdun, "function(){ alert('meee'); }" var ve var foo bir fonksiyonu olarak kaydetmek istiyorum. Genel kapsamda

var fn = "function(){ alert('meee'); }"; 
var foo = new Function("return ("+fn+")")(); 
foo(); 
// alerts "meee" 

Function ve eval arasındaki fark özel kapsamında eval çalışır olduğunu Function iken çalışır.

var x="haha", y="hehe"; 

function test() { 
    var x=15, y=34; 
    eval("alert('eval: ' + x + ', ' + y)"); 
    new Function("alert('Func: ' + x + ', ' + y)")(); 
} 

test(); 

// eval: 15, 34 
// Func: haha, hehe 

bir aldatıcı sonucu (konsolları eval kullanın) alırsınız, konsolda çalıştırmak için çalışmayın. Bir <script> etiketine yazarak ve tarayıcıya yükleyerek gerçek sonucu verecektir.

+0

'Fonksiyon' yapıcısının bu fonksiyonu yaratma biçiminin çok fazla aynı olmadığını eval'ın yaptığı gibi. Bu gerçekten "eval" ın sadece başka bir şeklidir, bu yüzden tüm bu gerçekten "eval" sözcüğünü kullanmaktan kaçınmaktır. ama bunu '7' veren pencere [(typeof [] [0]) [3] + "val"] ("4 + 3") 'gibi de yapabilirsiniz. – Claudiu

+0

yinelemek zorundayım. "eval" kullanırsanız komut dosyası enjeksiyonundan veya şifrelerinizi çaldığınızdan korktuğunu söylüyorsunuz. iyi, ** BU DEĞER YARATIYOR ** !!! aynı şeydir - rasgele kod JS tarafından derlenmekte ve çalıştırılmaktadır. Neden kullanıcıların kendi işlevlerini kodunuza sunabilmelerini istiyorsunuz? – Claudiu

0

Ben bildiğim kadarıyla ... Bir şekilde javascript etrafında geçen içermeyen bir komut dosyası enjeksiyon saldırısına kendinizi savunmasız yapmadan yapmaya çalıştığınız şeyi yapmanın daha iyi bir yolu muhtemelen orada dize.

+0

Biliyorum bu konuda çok şey var ama güvenli bir bilgiye ihtiyacım var. Kullanıcı adlarını ve şifreleri verebileceğine ya da herşeyi sileceğine dair izlenimim var :) – Val

+0

gerçekten javascript'inizin nereden geldiğine bağlı? Eğer bir veritabanındaysa ve kod dizelerinin içine girebilmesinin tek yolu güvenli bir formdadır ya da neyin var, muhtemelen tamam. Öte yandan, eğer kimsenin arka ucuna karşı keyfi bir kod yürütmesine izin verirseniz, muhtemelen sorun çıkarırsınız. En çok düşündüğüm javascript saldırıları, veritabanınızdan ziyade kullanıcı etkileşimini etkileyecek. Tek yapmanız gereken, büyük olasılıkla tuş vuruşlarını kaydeden ve bunları xhr kayıtları veya benzerleri aracılığıyla uzak bir siteye gönderen bir komut dosyasıdır. Bir html elemanından gelen – vicatcu

+0

innerhtml .. – Val

3

MDC'a göre. Kullanın: Anders söylediği gibi

var multiply = new Function("x", "y", "return x * y"); 
var theAnswer = multiply(7, 6); 
+0

Eminim bir matematik dersi istemedim. tek istediğim metin olarak bir işlev içeren bir dize yapmak ve çağırmak. eval kullanarak, güvenli ve çok yavaş kullanmanız kolay. – Val

+1

@Val, kullanmanız gereken şeylerin bir örneğidir, referans sayfasını okuyun. – Anders

+0

Özelliklerin belirtildiği yerde tekrar okumanızı öneririm.'Reddedilen argümanlar' ve 'arity Deprecated' – Val

İlgili konular