Jawaban:
Dengan eval("my script here")
fungsi.
Anda dapat menjalankannya menggunakan fungsi. Contoh:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
var F=function(){eval(theInstructions);};
?
new Function("alert('Hello World');")()
The eval
fungsi akan mengevaluasi string yang dilewatkan untuk itu.
Tetapi penggunaan eval
bisa berbahaya , jadi gunakan dengan hati-hati.
Sunting: annakata memiliki poin yang bagus - Tidak hanya eval
berbahaya , itu lambat . Ini karena kode yang akan dievaluasi harus diuraikan di tempat, sehingga akan mengambil beberapa sumber daya komputasi.
eval()
berbahaya. Apakah ada alternatif lain?
Gunakan eval ().
W3 Sekolah tur eval . Situs memiliki beberapa contoh eval yang dapat digunakan. Dokumentasi Mozilla membahas hal ini secara rinci.
Anda mungkin akan mendapatkan banyak peringatan tentang penggunaan ini dengan aman. JANGAN mengizinkan pengguna untuk menyuntikkan APA SAJA ke eval () karena ini adalah masalah keamanan yang sangat besar.
Anda juga ingin tahu bahwa eval () memiliki cakupan yang berbeda .
eval
lebih baik kepada saya daripada artikel W3Schools. Sesuatu yang dapat dibaca dengan penjelasan dan contoh yang bagus adalah developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . Dan tidak, saya tidak bjorninge
Coba ini:
var script = "<script type='text/javascript'> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
Secara pribadi, saya tidak mengujinya tetapi tampaknya berhasil.
Sedikit seperti yang dikatakan @Hossein Hajizadeh alerady, meskipun secara lebih rinci:
Ada alternatif untuk eval()
.
Fungsi setTimeout()
ini dirancang untuk mengeksekusi sesuatu setelah interval milidetik, dan kode yang akan dieksekusi kebetulan diformat sebagai string.
Ini akan bekerja seperti ini:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1
berarti akan menunggu 1 milidetik sebelum menjalankan string.
Ini mungkin bukan cara yang paling benar untuk melakukannya, tetapi ini berhasil.
setTimeout
? Perhatikan bahwa dalam hal apa pun itu akan membuat eksekusi tidak sinkron. Ini berarti bahwa semua kode yang mengikuti setTimeout
panggilan akan dipanggil sebelum kode dilewatkan ke setTimeout
(bahkan jika dipanggil dengan 0 (nol)).
Gunakan eval seperti di bawah ini. Eval harus digunakan dengan hati-hati, pencarian sederhana tentang " eval is evil " harus memberikan beberapa petunjuk.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
Memeriksa ini pada banyak skrip yang kompleks dan dikaburkan:
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);
Jika Anda ingin menjalankan perintah tertentu (yaitu string) setelah waktu tertentu - cmd = kode Anda - InterVal = tunda untuk menjalankan
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
di InterVal
dikapitalisasi?
Untuk pengguna yang menggunakan simpul dan yang peduli dengan implikasi konteks eval()
tawaran nodejs vm
. Ini menciptakan mesin virtual V8 yang dapat mem-sandbox eksekusi kode Anda dalam konteks terpisah.
Mengambil langkah lebih jauh adalah vm2
yang mengeras vm
memungkinkan vm untuk menjalankan kode yang tidak dipercaya.
https://nodejs.org/api/vm.html - Nodejs resmi / vm
https://github.com/patriksimek/vm2 - Extended 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);
Tapi ini bisa berbahaya jika Anda mengambil data dari pengguna, meskipun saya kira jika mereka membuat peramban mereka sendiri adalah masalah mereka.
eval
kode dari pengguna, yang misalnya dapat membiarkan pengguna mencuri akun pengguna lain tanpa mereka sadari hanya dengan memuat halaman.
Tidak yakin apakah ini curang atau tidak:
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
Fungsi baru dan apply () bersama-sama juga berfungsi
var a=new Function('alert(1);')
a.apply(null)
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Saya menjawab pertanyaan serupa dan mendapat ide lain bagaimana mencapai ini tanpa menggunakan eval()
:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
Pada kode di atas Anda pada dasarnya membuat Blob, berisi skrip Anda, untuk membuat URL Obyek (representasi file atau objek Blob dalam memori browser). Karena Anda memiliki src
properti pada <script>
tag, skrip akan dieksekusi dengan cara yang sama seolah-olah itu diambil dari URL lain.
eval harus melakukannya.
eval(s);
eval(s);
Ingat juga, bahwa eval sangat kuat dan sangat tidak aman. Anda sebaiknya yakin bahwa skrip yang Anda jalankan aman dan tidak dapat diubah oleh pengguna.
Seseorang dapat menggunakan mathjs
Cuplikan dari tautan di atas:
// 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
adalah benda apa pun. Jadi, jika Anda melewatkan lingkup global ke fungsi evalute, Anda mungkin dapat menjalankan alert () secara dinamis.
Juga mathjs adalah pilihan yang jauh lebih baik daripada eval () karena berjalan dalam kotak pasir.
Seorang pengguna dapat mencoba untuk menyuntikkan kode JavaScript berbahaya melalui parser ekspresi. Pengurai ekspresi mathjs menawarkan lingkungan berpasir untuk mengeksekusi ekspresi yang seharusnya membuat ini tidak mungkin. Meskipun mungkin ada kerentanan keamanan yang tidak diketahui, jadi penting untuk berhati-hati, terutama ketika memungkinkan eksekusi sisi server dari ekspresi sewenang-wenang.
Mathjs versi yang lebih baru tidak menggunakan eval () atau Function ().
Parser secara aktif mencegah akses ke JavaScripts internal eval dan Function baru yang merupakan penyebab utama serangan keamanan. Mathjs versi 4 dan yang lebih baru tidak menggunakan eval JavaScript di bawah tenda. Versi 3 dan yang lebih lama memang menggunakan eval untuk langkah kompilasi. Ini bukan masalah keamanan secara langsung tetapi menghasilkan permukaan serangan yang lebih besar.
Menggunakan eval dan membuat Function baru untuk mengeksekusi javascript hadir dengan banyak risiko keamanan.
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
Saya lebih suka metode ini untuk mengeksekusi Javascript yang saya terima sebagai string.