Bagaimana cara menjalankan JavaScript yang merupakan string?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
javascript
divinci
sumber
sumber
Anda dapat menjalankannya menggunakan fungsi. Contoh:
sumber
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.sumber
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 .
sumber
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 bjorningeCoba ini:
Secara pribadi, saya tidak mengujinya tetapi tampaknya berhasil.
sumber
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:
1
berarti akan menunggu 1 milidetik sebelum menjalankan string.Ini mungkin bukan cara yang paling benar untuk melakukannya, tetapi ini berhasil.
sumber
setTimeout
? Perhatikan bahwa dalam hal apa pun itu akan membuat eksekusi tidak sinkron. Ini berarti bahwa semua kode yang mengikutisetTimeout
panggilan akan dipanggil sebelum kode dilewatkan kesetTimeout
(bahkan jika dipanggil dengan 0 (nol)).Saya pikir ini adalah cara terbaik.
sumber
Gunakan eval seperti di bawah ini. Eval harus digunakan dengan hati-hati, pencarian sederhana tentang " eval is evil " harus memberikan beberapa petunjuk.
sumber
Memeriksa ini pada banyak skrip yang kompleks dan dikaburkan:
sumber
Jika Anda ingin menjalankan perintah tertentu (yaitu string) setelah waktu tertentu - cmd = kode Anda - InterVal = tunda untuk menjalankan
sumber
Val
diInterVal
dikapitalisasi?Untuk pengguna yang menggunakan simpul dan yang peduli dengan implikasi konteks
eval()
tawaran nodejsvm
. Ini menciptakan mesin virtual V8 yang dapat mem-sandbox eksekusi kode Anda dalam konteks terpisah.Mengambil langkah lebih jauh adalah
vm2
yang mengerasvm
memungkinkan vm untuk menjalankan kode yang tidak dipercaya.https://nodejs.org/api/vm.html - Nodejs resmi / vm
https://github.com/patriksimek/vm2 - Extended vm2
sumber
Tapi ini bisa berbahaya jika Anda mengambil data dari pengguna, meskipun saya kira jika mereka membuat peramban mereka sendiri adalah masalah mereka.
sumber
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:
sumber
Fungsi baru dan apply () bersama-sama juga berfungsi
sumber
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Saya menjawab pertanyaan serupa dan mendapat ide lain bagaimana mencapai ini tanpa menggunakan
eval()
: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.sumber
sumber
eval harus melakukannya.
sumber
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.
sumber
Seseorang dapat menggunakan mathjs
Cuplikan dari tautan di atas:
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.
Mathjs versi yang lebih baru tidak menggunakan eval () atau Function ().
sumber
Menggunakan eval dan membuat Function baru untuk mengeksekusi javascript hadir dengan banyak risiko keamanan.
Saya lebih suka metode ini untuk mengeksekusi Javascript yang saya terima sebagai string.
sumber