HN Show: Menjalankan JavaScript di sandbox WebAssembly QuickJS
(github.com/sebastianwessel)QuickJS - Menjalankan JavaScript di sandbox WebAssembly QuickJS
Paket TypeScript ini memungkinkan eksekusi kode JavaScript secara aman di dalam sandbox WebAssembly menggunakan mesin QuickJS. Cocok untuk mengisolasi dan menjalankan kode yang tidak tepercaya dengan aman, serta memanfaatkan mesin QuickJS yang ringan dan cepat yang dikompilasi ke WebAssembly untuk menyediakan lingkungan eksekusi kode yang tangguh.
Fitur
- Keamanan: Dapat menjalankan kode JavaScript yang tidak tepercaya dalam lingkungan yang aman dan terisolasi
- Sistem file: Dapat me-mount sistem file virtual
- Modul Node kustom: Dapat me-mount modul Node kustom
- Klien Fetch: Dapat menyediakan klien fetch untuk melakukan panggilan http(s)
- Test runner: Menyertakan test runner dan
expectberbasis chai - Kinerja: Dapat memanfaatkan keunggulan mesin QuickJS yang ringan dan efisien
- Keberagaman: Dapat dengan mudah diintegrasikan dengan proyek TypeScript yang sudah ada
- Kesederhanaan: Menyediakan API yang ramah pengguna untuk menjalankan dan mengelola kode JavaScript di dalam sandbox
Lihat dokumentasi lengkap
Temukan contoh di repositori
Penggunaan dasar
Berikut contoh sederhana penggunaan paket ini:
import { quickJS } from '@sebastianwessel/quickjs'
// Pengaturan umum seperti memuat dan menginisialisasi QuickJS wasm
// Karena ini pekerjaan yang intensif sumber daya, sebaiknya hanya dilakukan sekali jika memungkinkan
const { createRuntime } = await quickJS()
// Membuat instance runtime setiap kali menjalankan kode js
const { evalCode } = await createRuntime({
allowFetch: true, // menyuntikkan fetch dan mengizinkan kode mengambil data
allowFs: true, // me-mount sistem file virtual dan menyediakan modul node:fs
env: {
MY_ENV_VAR: 'env var value'
},
})
const result = await evalCode(`
import { join } as path from 'path'
const fn = async ()=>{
console.log(join('src','dist')) // mencatat "src/dist" pada sistem host
console.log(env.MY_ENV_VAR) // mencatat "env var value" pada sistem host
const url = new URL('https://example.com')
const f = await fetch(url)
return f.text()
}
export default await fn()
`)
console.log(result) // { ok: true, data: '<!doctype html>\n<html>\n[....]</html>\n' }
Kredit
Pustaka ini dibangun di atas:
- quickjs-emscripten
- quickjs-emscripten-sync
- memfs
- Chai
Alat yang digunakan:
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
Lisensi
Proyek ini berada di bawah lisensi MIT.
Paket ini ideal bagi pengembang yang ingin menjalankan kode JavaScript secara aman di dalam aplikasi TypeScript, dan menjamin kinerja serta keamanan melalui sandbox WebAssembly QuickJS.
Ringkasan GN⁺
Artikel ini menjelaskan cara menjalankan kode JavaScript secara aman di dalam sandbox WebAssembly menggunakan mesin QuickJS. Ini sangat berguna untuk mengisolasi dan menjalankan kode yang tidak tepercaya. QuickJS menawarkan kinerja yang ringan namun cepat, serta keunggulan integrasi yang mudah dengan proyek TypeScript. Proyek lain yang menawarkan fungsi serupa antara lain Deno dan Node.js.
1 komentar
Komentar Hacker News
penulis library quickjs-emscripten memuji standard library dari library tersebut
fetchdengan menggunakan cookie yang sama seperti fungsifetchmilik hostdi pekerjaan sebelumnya, pernah mengalami banyak "segmentation faults" dan error saat menggunakan quickjs-emscripten
ada beberapa cara untuk melakukan sandboxing JavaScript
menanyakan apakah ini bisa dijalankan di browser
pernah mencoba quickjs, tetapi akhirnya memilih isolated-vm
penulis library sandbox JS lain menganggap pendekatan quickjs-emscripten menarik
createRuntimedapat mendefinisikan pemanggilan ke lingkungan host selainfetchberpikir bahwa library ini dapat digunakan untuk menjalankan kode JS yang diberikan pengguna
menyebutkan bahwa performa QuickJS tidak bisa menyaingi VM JS host
sedang mengerjakan wrapper tingkat tinggi untuk quickjs-emscripten
require()sulitlibrary quickjs-emscripten-sync menyediakan sinkronisasi otomatis antara fungsi host dan guest, yang bisa menjadi permukaan serangan yang besar
menanyakan apakah ini bisa dijalankan di browser karena dikompilasi ke wasm