1 पॉइंट द्वारा GN⁺ 2024-07-08 | 1 टिप्पणियां | WhatsApp पर शेयर करें

QuickJS - WebAssembly QuickJS sandbox में JavaScript चलाना

यह TypeScript पैकेज QuickJS engine का उपयोग करके WebAssembly sandbox के भीतर JavaScript कोड को सुरक्षित रूप से चलाने में मदद करता है। यह untrusted code को सुरक्षित रूप से isolate करके चलाने के लिए उपयुक्त है, और WebAssembly में compile किए गए हल्के और तेज़ QuickJS engine का उपयोग करके एक मज़बूत code execution environment प्रदान करता है।

विशेषताएँ

  • सुरक्षा: untrusted JavaScript code को सुरक्षित और isolated environment में चलाया जा सकता है
  • फ़ाइल सिस्टम: virtual file system को mount किया जा सकता है
  • custom Node modules: custom Node modules को mount किया जा सकता है
  • Fetch client: http(s) calls करने के लिए fetch client उपलब्ध कराया जा सकता है
  • test runner: test runner और chai-आधारित expect शामिल है
  • प्रदर्शन: हल्के और efficient QuickJS engine के फ़ायदों का उपयोग किया जा सकता है
  • विविधता: मौजूदा TypeScript projects के साथ आसानी से integrate किया जा सकता है
  • सरलता: sandbox के भीतर JavaScript code को चलाने और manage करने के लिए user-friendly API प्रदान करता है

पूरा दस्तावेज़ देखें

repository में examples खोजें

बुनियादी उपयोग

पैकेज का उपयोग करने का एक सरल उदाहरण नीचे दिया गया है:

import { quickJS } from '@sebastianwessel/quickjs'

// QuickJS wasm load और initialization जैसी सामान्य setup
// यह resource-intensive काम है, इसलिए संभव हो तो इसे केवल एक बार करना चाहिए
const { createRuntime } = await quickJS()

// हर बार js code चलाते समय runtime instance बनाया जाता है
const { evalCode } = await createRuntime({
  allowFetch: true, // fetch inject करता है और code को data लाने की अनुमति देता है
  allowFs: true, // virtual file system को mount करता है और node:fs module प्रदान करता है
  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')) // host system पर "src/dist" log करता है
    console.log(env.MY_ENV_VAR) // host system पर "env var value" log करता है
    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' }

क्रेडिट

यह लाइब्रेरी निम्न पर आधारित है:

  • quickjs-emscripten
  • quickjs-emscripten-sync
  • memfs
  • Chai

इस्तेमाल किए गए tools:

  • Bun
  • Biome
  • Hono
  • poolifier-web-worker
  • tshy
  • autocannon

लाइसेंस

यह प्रोजेक्ट MIT license के अंतर्गत है।


यह पैकेज उन developers के लिए आदर्श है जो TypeScript applications के भीतर JavaScript code को सुरक्षित रूप से चलाना चाहते हैं, और QuickJS WebAssembly sandbox के माध्यम से performance और security सुनिश्चित करता है।

GN⁺ का सार

यह लेख QuickJS engine का उपयोग करके WebAssembly sandbox में JavaScript code को सुरक्षित रूप से चलाने का तरीका समझाता है। यह untrusted code को isolate करके चलाने में बहुत उपयोगी है। QuickJS हल्का होने के साथ तेज़ प्रदर्शन भी देता है, और TypeScript projects के साथ आसानी से integrate होने का लाभ प्रदान करता है। इसी तरह की सुविधाएँ देने वाले प्रोजेक्ट्स में Deno और Node.js शामिल हैं।

1 टिप्पणियां

 
GN⁺ 2024-07-08
Hacker News टिप्पणियाँ
  • quickjs-emscripten लाइब्रेरी के लेखक ने लाइब्रेरी की standard library की प्रशंसा की

    • पूछा कि क्या इसे browser या bundler में चलाकर देखा गया है
    • Webpack जैसे bundler के साथ compatibility issues की ओर इशारा किया
    • सुरक्षा चेतावनी: लाइब्रेरी guest code को host के fetch function वाले ही cookies का उपयोग करके fetch call करने देती है
    • untrusted code चलाते समय सावधान रहना चाहिए
    • quickjs-emscripten low-level है और जादुई जैसी सुविधाओं से बचता है ताकि सुरक्षा सुनिश्चित की जा सके
    • untrusted code चलाते समय sandbox और API का सावधानी से audit करना चाहिए
    • Figma के plugin sandbox security पर ब्लॉग पोस्ट देखने की सिफारिश की
  • पिछली नौकरी में quickjs-emscripten का उपयोग करते हुए कई "segmentation faults" और errors का अनुभव हुआ

    • project बंद हो गया था, और अगर फिर से करना हो तो officially supported wasm bundle का उपयोग करेंगे
  • JavaScript को sandbox करने के कई तरीके हैं

    • पूछा कि क्या DOM access को sandbox करने का कोई तरीका है
    • iframes ही एकमात्र तकनीक हैं, लेकिन वे भारी और धीमे हैं
    • plugin host करने वाला app लिख रहे हैं, और plugins को DOM access देने से समस्या हो सकती है
  • पूछा कि क्या यह browser में चल सकता है

    • supported environments के बारे में कोई उल्लेख नहीं मिला
  • quickjs आज़माया था, लेकिन अंततः isolated-vm चुना

    • दोनों libraries सुरक्षा आवश्यकताओं को पूरा करती थीं, लेकिन performance के मामले में isolated-vm बेहतर था
  • एक अन्य JS sandbox library के लेखक ने quickjs-emscripten के approach को दिलचस्प बताया

    • कहा कि JS-in-JS या JS-in-WASM उच्च स्तर का isolation प्रदान करता है
    • इशारा किया कि Node.js को isolation और sandboxing को ध्यान में रखकर design नहीं किया गया था
    • पूछा कि क्या createRuntime fetch के अलावा host environment के लिए calls define कर सकता है
    • कहा कि browser support उपयोगी होगा
  • लगा कि इस लाइब्रेरी के जरिए user द्वारा दिया गया JS code चलाया जा सकता है

    • sandbox environment में bundler चलाने के तरीके पर सिफारिश मांगी
  • कहा कि QuickJS का performance host JS VM से प्रतिस्पर्धा नहीं कर सकता

    • लेकिन पुराने C interpreter या JavaScript में implemented interpreter से तेज है
  • quickjs-emscripten के लिए high-level wrapper पर काम कर रहे थे

    • quickjs-emscripten का API quickjs के C API से बहुत मिलता-जुलता है, इसलिए उपयोग करना कठिन है
    • require() support लागू करना कठिन था
    • module files को memory file system में preload करने का तरीका इस्तेमाल किया
  • quickjs-emscripten-sync लाइब्रेरी host और guest functions का automatic synchronization देती है, जो एक बड़ा attack surface बन सकता है

    • sandbox escape की संभावना पर चिंता जताई
  • पूछा कि क्या wasm में compile होने के कारण यह browser में चल सकता है

    • जानना चाहा कि क्या cookies जोड़े बिना fetch request की जा सकती है