Dize olarak saklanan JavaScript kodunu yürütün


173

Dize olan bazı JavaScript'leri nasıl yürütebilirim?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}

Yanıtlar:



133

Bir işlev kullanarak çalıştırabilirsiniz. Misal:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

3
ama sonunda - aramakla aynı şey değil var F=function(){eval(theInstructions);};mi?
Jörn Berkefeld

14
evet ve hayır: eval kodu ile de yürütülürken, Function () kodu ile F () 'ye kadar yürütülmez (sözdizimi hatası olup olmadığını kontrol et ancak kodu yürütmek istemiyor)
G3z

2
@stefan It's beatifull ...new Function("alert('Hello World');")()
Andrés Morales

Bunu bir try / catch bloğu içinde denedim ve mükemmel çalışıyor. Artık bir metin bloğuna yazılan herhangi bir JavaScript kodunu alabilir, işlevime geçirebilir ve yürütebilirim. Catch bloğu daha sonra JavaScript motorundan bir DOM öğesine hata mesajları ekleyebilir ve koddaki hataları görüntüleyebilir. Birisi yazdığım işlevi istiyorsa, bir kez topladım, buraya gönderebilirim.
David Edwards

@DavidEdwards Eğer hala varsa ve gönderirseniz harika olurdu.
Anoop

60

evalFonksiyon kendisine iletilen bir dize değerlendirecektir.

Ancak kullanımı evaltehlikeli olabilir , bu yüzden dikkatli kullanın.

Düzenleme: annakata iyi bir noktaya sahip - Sadece eval tehlikeli değil, yavaş . Bunun nedeni, değerlendirilecek kodun yerinde ayrıştırılması gerektiğinden, bazı bilgi işlem kaynaklarını gerektirecektir.


35
süper tehlikeli VE yavaş - kalın, italik, altı çizili ve h1 gerekir
annakata

5
Bunun, ayrıştırılması gereken sayfanın başka bir yerine JavaScript yüklemekten daha yavaş olduğundan şüpheliyim. Daha yavaşsa, bunun nedeni, o kapsam için kaynak yaratmaya zorlayabilecek farklı bir kapsamda yapılmasıdır.
cgp

6
Eğer eval()tehlikeli dersen. Alternatif var mı?
white_gecko

4
@coobird Bunun biraz geç olduğunu biliyorum ama neden bu kadar tehlikeli? Kullanıcı, konsolu kullanarak web sitenizde JavaScript kodunu kolayca çalıştırabilir.
jkd

8
güvenliğiniz hiç bir şekilde istemci tarafı javascript'e bağlıysa, büyük zaman harcadınız ve eval ile ilgisi yoktur.
Matthew

20

Eval () kullanın.

W3 Okulları eval turu . Sitede bazı kullanılabilir değerlendirme örnekleri vardır. Mozilla belgeleri bunu ayrıntılı olarak ele almaktadır.

Muhtemelen bunu güvenli bir şekilde kullanma konusunda çok fazla uyarı alacaksınız . büyük bir güvenlik sorunu olduğu için kullanıcıların eval () 'a ANYTHING enjekte etmesine izin VERMEYİN .

Ayrıca eval () 'in farklı bir kapsamı olduğunu bilmek isteyeceksiniz .


11
w3fools.com . W3C'nin eval hakkında söyleyecek bir şeyi bile yok. Resmi bir şeye bağlantı vermek istiyorsanız, ecma-international.org/ecma-262/5.1/#sec-15.1.2.1
Bergi

7
Resmi bir şeye bağlantı vermek istemedim, okunabilir bir şeye bağlantı vermek istedim - sen bağlantılı, o, hiçbir örnekler, tinker hiçbir şekilde nasıl kullanıldığına ilişkin herhangi bir açıklama verir ve izolasyon yöntemini tarif Yeni başlayanlar için, bu tamamen uygunsuz bir bağlantıdır Hey, @bjorninge olmayacak mıydınız?
cgp

1
Spesifikasyon evalbenim için bu W3Schools makalesinden daha iyi açıklanıyor . İyi bir açıklama ve örneklerle okunabilir bir şey developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… olacaktır . Ve hayır, ben bjorninge değilim
Bergi

Bunun dokümantasyon olmadığını kabul edeceğim ve Mozilla'nın sayfasının sayfanın daha iyi bir resmi olduğunu kabul edeceğim. Cevabımı geri bildirime dayanarak biraz değiştirdim
cgp

1
Bu ecma-international.org bağlantısına gelince, bunu JS ile 15 dakikadan fazla deneyime sahip herkes tarafından okunabilir ve takdir edilebilir olarak tanımlarım. Bu çok hoş.
i336_

16

Bunu dene:

  var script = "<script type='text/javascript'> content </script>";
  //using jquery next
  $('body').append(script);//incorporates and executes inmediatelly

Şahsen ben test etmedim ama işe yarıyor gibi görünüyor.


1
Senaryoda kapatma> 'dan kaçmayı unuttun: var script = "<script type = \" text / javascript \ "> content </ script \>";
rlib

1
Neden kapanıştan kaçmanız gerekiyor>?
Jools

11

Ne gibi biraz @Hossein Hacızade alerady olsa daha ayrıntılı olarak şunları söyledi:

Buna bir alternatif var eval().

İşlev setTimeout()milisaniye aralığından sonra bir şey yürütmek üzere tasarlanmıştır ve çalıştırılacak kod bir dize olarak biçimlendirilir.

Şu şekilde çalışır:

ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}

1 dizeyi yürütmeden önce 1 milisaniye bekleyeceği anlamına gelir.

Bunu yapmanın en doğru yolu olmayabilir, ama işe yarıyor.


0 (sıfır) 'ı geçebildiğinizde neden bir milisaniye harcıyorsunuz setTimeout? Her durumda, yürütmeyi eşzamansız hale getireceğini unutmayın. Bu, setTimeoutçağrıyı izleyen tüm kodun kod geçilmeden önce çağrıldığı anlamına gelir setTimeout(0 (sıfır) ile çağrılsa bile).
jox

Set‍♀️ setTimeout'un nasıl çalıştığını daha iyi açıkladığını düşündü
Anton Juul-Naber

8
new Function('alert("Hello")')();

Bence bu en iyi yol.


7

Eval'i aşağıdaki gibi kullanın . Eval dikkatle kullanılmalıdır, " eval kötüdür " hakkında basit bir arama bazı işaretler atmalıdır.

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    eval(s);
}

2
İyi bir ipucu "eval kötüdür" hakkında basit bir arama Teşekkürler!
Taptronic

5

Bunu birçok karmaşık ve gizlenmiş komut dosyasında kontrol ettim:

var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);

5

Belirli bir süreden sonra belirli bir komutu (yani dize) yürütmek istiyorsanız - cmd = kodunuz - InterVal = çalıştırma gecikmesi

 function ExecStr(cmd, InterVal) {
    try {
        setTimeout(function () {
            var F = new Function(cmd);
            return (F());
        }, InterVal);
    } catch (e) { }
}
//sample
ExecStr("alert(20)",500);

@SteelBrain, ExecStr tarafından çalıştırılan bir örnek ekler ("alert (20)", 500);
Hossein Hajizadeh

1
Neden olduğu Valiçinde InterValbüyük harfle?
Redwolf Programları

4

Düğüm kullanan ve düğüm eval()tekliflerinin bağlamsal etkileriyle ilgilenen kullanıcılar içinvm . Kodunuzun yürütülmesini ayrı bir bağlamda sanallaştırabilen bir V8 sanal makinesi oluşturur.

İşleri bir adım daha ileri götürmek, vm'nin güvenilmeyen kodu çalıştırmasına izin vm2veren sertleşir vm.

const vm = require('vm');

const x = 1;

const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.

const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);

console.log(sandbox.x); // 42
console.log(sandbox.y); // 17

console.log(x); // 1; y is not defined.

2
"Eval kötüdür" demek ve bağlam veya çözüm vermemek yerine, bu aslında sorunu çözmeye çalışır. Sizin için +1
Redwolf Programları

3
eval(s);

Ancak, kullanıcılardan veri alıyorsanız, tehlikeli olabilir, ancak kendi tarayıcılarını çökertiyorlarsa, sorun budur.


1
kesinlikle. Eval sunucu tarafında tehlikelidir. İstemcide ... çok fazla değil. Kullanıcı sadece javascript yazabilir: someevilcode tarayıcının ve bomun adresine. Orada değerlendirin.
Esben Skov Pedersen

@EsbenSkovPedersen Bu, en azından kromda engellenir ve kullanıcılardan evalkod alan bir sitenin aksine , örneğin kullanıcıların yalnızca sayfayı yükleyerek bilmeden diğer kullanıcıların hesaplarını çalmasına izin verebilecek kullanıcı işlemleri gerektirir .
1j01

1
@ 1j01 Adil olmak gerekirse yorumum beş yaşında.
Esben Skov Pedersen

@EsbenSkovPedersen Bu doğru :)
1j01

2

Bunun hile olup olmadığından emin değilim:

window.say = function(a) { alert(a); };

var a = "say('hello')";

var p = /^([^(]*)\('([^']*)'\).*$/;                 // ["say('hello')","say","hello"]

var fn = window[p.exec(a)[1]];                      // get function reference by name

if( typeof(fn) === "function") 
    fn.apply(null, [p.exec(a)[2]]);                 // call it with params


2

Benzer soruyu cevaplıyordum ve bunu kullanmadan nasıl başaracağımı başka bir fikrim var eval():

const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);

Yukarıdaki kodda temel olarak Nesne URL'si (Tarayıcı belleğinde Dosya veya Blob nesnesinin temsili) oluşturmak için komut dosyanızı içeren Blob oluşturursunuz. Eğer sahip olduğundan srcüzerinde mülkiyet <script>etiketi, senaryo başka herhangi bir URL'den yüklenmesi halinde aynı şekilde çalıştırılacaktır.


2
function executeScript(source) {
    var script = document.createElement("script");
    script.onload = script.onerror = function(){ this.remove(); };
    script.src = "data:text/plain;base64," + btoa(source);
    document.body.appendChild(script);
}

executeScript("alert('Hello, World!');");


0
eval(s);

Yine de, bu eval çok güçlü ve oldukça güvensiz olduğunu unutmayın. Yürüttüğünüz komut dosyasının kullanıcılar tarafından güvenli ve değiştirilemez olduğundan emin olmalısınız.


1
JS'de her şey kullanıcı tarafından değiştirilebilir "javascript: document.write (" Merhaba Dünya ");" hemen hemen tüm tarayıcının adres çubuğuna
UnkwnTech

1
Evet, ancak küresel değişkenleri kullanarak, işlevlerinizi kapanışlarda vb. Gizleyerek onun için zorlaştırabilirsiniz. Ayrıca, veba gibi değerlendirmeden kaçınarak =)
PatrikAkerstrand

0

Mathjs kullanabilir

Snippet yukarıdaki bağlantıdan:

// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)')        // 5
math.evaluate('sqrt(-4)')               // 2i
math.evaluate('2 inch to cm')           // 5.08 cm
math.evaluate('cos(45 deg)')            // 0.7071067811865476

// provide a scope
let scope = {
    a: 3,
    b: 4
}
math.evaluate('a * b', scope)           // 12
math.evaluate('c = 2.3 + 4.5', scope)   // 6.8
scope.c                                

scopeherhangi bir nesnedir. Dolayısıyla, global kapsamı değerlendirme işlevine iletirseniz, alert () işlevini dinamik olarak yürütebilirsiniz.

Ayrıca mathjs, bir sanal alanda çalıştığından eval () 'den çok daha iyi bir seçenektir.

Bir kullanıcı, ifade ayrıştırıcısı aracılığıyla kötü amaçlı JavaScript kodu enjekte etmeye çalışabilir. Mathjs ifadesinin ayrıştırıcısı, bunu imkansız kılan ifadeleri yürütmek için korumalı bir ortam sunar. Bilinmeyen güvenlik açıkları olsa da, bu nedenle, özellikle sunucu tarafında rasgele ifadelerin yürütülmesine izin verirken dikkatli olmak önemlidir.

Mathjs'ın yeni sürümleri eval () veya Function () kullanmaz.

Ayrıştırıcı, JavaScripts iç değerlendirmesine ve güvenlik saldırılarının ana nedeni olan yeni İşlevlere erişimi engeller. Mathjs sürüm 4 ve daha yenisi, başlık altında JavaScript'in değerlendirmesini kullanmaz. Sürüm 3 ve daha eski sürümler derleme adımı için eval kullandılar. Bu doğrudan bir güvenlik sorunu değildir, ancak daha geniş bir saldırı yüzeyine neden olur.


0

Hem eval hem de javascript yürütmek için yeni bir işlev oluşturmak birçok güvenlik riski ile birlikte gelir.

const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);

Bir dize olarak aldığım Javascript yürütmek için bu yöntemi tercih ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.