1 poin oleh GN⁺ 2024-07-08 | 1 komentar | Bagikan ke WhatsApp

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 expect berbasis 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

 
GN⁺ 2024-07-08
Komentar Hacker News
  • penulis library quickjs-emscripten memuji standard library dari library tersebut

    • menanyakan apakah ini sudah dicoba dijalankan di browser atau bundler
    • menyoroti masalah kompatibilitas dengan bundler seperti Webpack
    • peringatan keamanan: library ini memungkinkan kode tamu memanggil fetch dengan menggunakan cookie yang sama seperti fungsi fetch milik host
    • perlu berhati-hati saat menjalankan kode yang tidak tepercaya
    • alasan quickjs-emscripten bersifat low-level dan menghindari fitur yang terasa seperti sihir adalah untuk memastikan keamanan
    • saat menjalankan kode yang tidak tepercaya, sandbox dan API harus diaudit dengan cermat
    • merekomendasikan untuk melihat posting blog tentang keamanan sandbox plugin Figma
  • di pekerjaan sebelumnya, pernah mengalami banyak "segmentation faults" dan error saat menggunakan quickjs-emscripten

    • proyeknya dihentikan, dan jika mengulang lagi akan memakai bundel wasm yang didukung secara resmi
  • ada beberapa cara untuk melakukan sandboxing JavaScript

    • menanyakan apakah ada cara untuk melakukan sandbox pada akses DOM
    • iframe adalah satu-satunya teknologi, tetapi terasa berat dan lambat
    • sedang menulis aplikasi yang meng-host plugin, dan mengizinkan plugin mengakses DOM bisa menimbulkan masalah
  • menanyakan apakah ini bisa dijalankan di browser

    • tidak dapat menemukan penyebutan tentang lingkungan yang didukung
  • pernah mencoba quickjs, tetapi akhirnya memilih isolated-vm

    • kedua library memenuhi kebutuhan keamanan, tetapi isolated-vm lebih unggul dari sisi performa
  • penulis library sandbox JS lain menganggap pendekatan quickjs-emscripten menarik

    • menyebutkan bahwa JS-in-JS atau JS-in-WASM memberikan tingkat isolasi yang tinggi
    • menunjukkan bahwa Node.js tidak dirancang dengan isolasi dan sandboxing sebagai pertimbangan utama
    • menanyakan apakah createRuntime dapat mendefinisikan pemanggilan ke lingkungan host selain fetch
    • menyebutkan bahwa dukungan browser akan berguna
  • berpikir bahwa library ini dapat digunakan untuk menjalankan kode JS yang diberikan pengguna

    • meminta rekomendasi cara menjalankan bundler di lingkungan sandbox
  • menyebutkan bahwa performa QuickJS tidak bisa menyaingi VM JS host

    • tetapi lebih cepat daripada interpreter C lama atau interpreter yang diimplementasikan dengan JavaScript
  • sedang mengerjakan wrapper tingkat tinggi untuk quickjs-emscripten

    • API quickjs-emscripten sangat mirip dengan API C milik quickjs sehingga sulit digunakan
    • implementasi dukungan require() sulit
    • menggunakan cara memuat lebih dulu file modul ke memory file system
  • library quickjs-emscripten-sync menyediakan sinkronisasi otomatis antara fungsi host dan guest, yang bisa menjadi permukaan serangan yang besar

    • khawatir tentang kemungkinan lolos dari sandbox
  • menanyakan apakah ini bisa dijalankan di browser karena dikompilasi ke wasm

    • ingin tahu apakah permintaan fetch bisa dilakukan tanpa melampirkan cookie