Yanıtlar:
İle eval("my script here")
fonksiyonu.
Bir işlev kullanarak çalıştırabilirsiniz. Misal:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
var F=function(){eval(theInstructions);};
mi?
new Function("alert('Hello World');")()
eval
Fonksiyon kendisine iletilen bir dize değerlendirecektir.
Ancak kullanımı eval
tehlikeli 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.
eval()
tehlikeli dersen. Alternatif var mı?
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 .
eval
benim 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
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.
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.
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).
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);
}
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);
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);
Val
içinde InterVal
büyük harfle?
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 vm2
veren sertleşir vm
.
https://nodejs.org/api/vm.html - Resmi düğüm / vm
https://github.com/patriksimek/vm2 - Genişletilmiş vm2
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.
eval(s);
Ancak, kullanıcılardan veri alıyorsanız, tehlikeli olabilir, ancak kendi tarayıcılarını çökertiyorlarsa, sorun budur.
eval
kod 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 .
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
Yeni İşlev ve Apply () birlikte de çalışır
var a=new Function('alert(1);')
a.apply(null)
eval()
. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
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.
eval yapmalı.
eval(s);
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.
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
scope
herhangi 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.
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.