Cabang: https://github.com/patriksimek/vm2/tree/feature-browsers
Perpustakaan: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js
Pemakaian
<script src="vm2.js"></script>
<script>
const vm = new vm2.VM();
alert(vm.run('Math.random()'));
</script>
Masalah
window.top
.MELAKUKAN
NodeVM
dari versi browser.BrowserVM
ke versi browser dengan fitur terkait browser.Solusi yang agak rumit dapat melibatkan penulisan ulang AST untuk membungkus setiap akses properti secara manual. Misalnya, let x = foo.bar
akan ditulis ulang menjadi let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar)
.
Berikut adalah contoh penulisan ulang AST, di mana node pemanggil fungsi dibungkus dalam node seperti ini .
Kerugian dari pendekatan ini adalah Anda tidak dapat dengan mudah men-debug kode yang ditulis ulang, dan dibutuhkan beberapa solusi untuk menangani Fungsi, eval, dan sejenisnya.
Menurut saya satu-satunya cara yang sangat berat yaitu dengan menafsirkan JS sendiri pada dasarnya, atau mengganti konstruksi Functions dengan implementasi khusus (seperti variabel injeksi dan konten parse). Metode ini akan sangat sulit diterapkan.
Penghapusan variabel tidak mungkin dilakukan karena variabel seperti document
dan top
tidak dapat dihapus atau ditimpa.
@ io4 , mengganti Fungsi, eval dan sejenisnya pada waktu proses tentu saja dimungkinkan dengan penulisan ulang AST dan itu juga tidak terlalu sulit. Namun, hal itu menyebabkan kinerja yang buruk, baik pada "waktu kompilasi" karena Anda harus menulis ulang secara harfiah setiap pemanggilan fungsi dan pada waktu proses karena pemanggilan fungsi harus melalui satu lapisan tipuan.
Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.
Harap jangan ditutup, ini adalah masalah yang relevan.
Saya berpikir untuk menggunakan pekerja web agar vm2 berfungsi di browser. Saya akan mencobanya.
Mungkin Anda juga bisa memasukkannya ke dalam iframe dengan sandbox. Dengan begitu, jika lolos, itu masih terbatas pada bingkai dan tidak dapat menavigasi konteks penelusuran tingkat atas.
Statusnya adalah kami tidak dapat menggunakan pekerja web karena mereka tidak berbagi memori dengan host. Saya sedang menguji iframe dengan sandbox, tetapi tidak berhasil juga. Tanpa opsi allow-same-origin
, vm2 bahkan tidak dimulai. Dengan mengaktifkan opsi itu, saya dapat mengakses jendela level atas. Tapi saya tidak menyerah :)
Jenis kesalahan apa yang diberikannya kepada Anda? Apakah itu perlu mengakses variabel? Apakah perpustakaan itu hilang? Data apa saja yang bisa diambil dengan bertukar pesan antar iframe?
Saya mencoba untuk memperbaiki akses ke jendela dengan trik yang sama seperti yang dilakukan realms-shim.
Implementasi dapat ditemukan di sini: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
Kerugiannya adalah semua yang ada di vm berjalan dalam mode ketat.
@patriksimek untuk mengatasi masalah window.top
, dapatkah Anda tidak mengamati objek dan mematikan skrip (lempar dan kesalahan) jika diubah / digunakan? Jadi, amati properti dan fungsi bungkus
Cabang: https://github.com/patriksimek/vm2/tree/feature-browsers
Perpustakaan: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.jsPemakaian
<script src="vm2.js"></script> <script> const vm = new vm2.VM(); alert(vm.run('Math.random()')); </script>
Masalah
- Sandbox dapat di-escape melalui
window.top
.MELAKUKAN
- Hapus
NodeVM
dari versi browser.- Tambahkan
BrowserVM
ke versi browser dengan fitur terkait browser.- Tes browser otomatis.
Saya tidak tahu cara untuk mengamati window
atau window.top
dengan cara yang memungkinkan untuk melempar sebelum sesuatu terjadi.
Hai
Saya perlu mengimpor vm2.js sebagai modul ke file skrip.
Dapatkah seseorang tolong bantu? Terima kasih
Hai
Saya perlu mengimpor vm2.js sebagai modul ke file skrip.
Dapatkah seseorang tolong bantu? Terima kasih
Bekerja sebagai modul: menambahkan module.exports = vm2;
di akhir file.
Komentar yang paling membantu
Saya berpikir untuk menggunakan pekerja web agar vm2 berfungsi di browser. Saya akan mencobanya.