1 puan yazan GN⁺ 2024-07-08 | 1 yorum | WhatsApp'ta paylaş

QuickJS - WebAssembly QuickJS sandbox’ında JavaScript çalıştırma

Bu TypeScript paketi, QuickJS motorunu kullanarak JavaScript kodunu bir WebAssembly sandbox’ı içinde güvenli şekilde çalıştırmayı mümkün kılar. Güvenilmeyen kodu güvenli biçimde izole edip çalıştırmak için uygundur ve WebAssembly’ye derlenmiş hafif ve hızlı QuickJS motorundan yararlanarak sağlam bir kod çalıştırma ortamı sunar.

Özellikler

  • Güvenlik: Güvenilmeyen JavaScript kodunu güvenli ve izole bir ortamda çalıştırabilir
  • Dosya sistemi: Sanal dosya sistemi mount edilebilir
  • Özel Node modülleri: Özel Node modülleri mount edilebilir
  • Fetch istemcisi: http(s) çağrıları yapabilen bir fetch istemcisi sağlanabilir
  • Test runner: Test runner ve chai tabanlı expect içerir
  • Performans: Hafif ve verimli QuickJS motorunun avantajlarından yararlanabilir
  • Çeşitlilik: Mevcut TypeScript projeleriyle kolayca entegre edilebilir
  • Basitlik: Sandbox içinde JavaScript kodunu çalıştırmak ve yönetmek için kullanıcı dostu bir API sunar

Tüm belgeleri görüntüle

Depoda örnekleri bul

Temel kullanım

Aşağıda paketin kullanımına dair basit bir örnek yer alır:

import { quickJS } from '@sebastianwessel/quickjs'

// QuickJS wasm yükleme ve başlatma gibi genel kurulum
// Kaynak yoğun bir işlem olduğu için mümkünse yalnızca bir kez yapılmalı
const { createRuntime } = await quickJS()

// Her js kodu çalıştırmasında bir runtime instance’ı oluşturulur
const { evalCode } = await createRuntime({
  allowFetch: true, // fetch enjekte eder ve kodun veri almasına izin verir
  allowFs: true, // sanal dosya sistemini mount eder ve node:fs modülünü sağlar
  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 sistemde "src/dist" olarak loglanır
    console.log(env.MY_ENV_VAR) // Host sistemde "env var value" olarak loglanır
    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' }

Katkılar ve teşekkür

Bu kütüphane şu projeleri temel alır:

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

Kullanılan araçlar:

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

Lisans

Bu proje MIT lisansı altındadır.


Bu paket, TypeScript uygulamaları içinde JavaScript kodunu güvenli şekilde çalıştırmak isteyen geliştiriciler için idealdir ve QuickJS WebAssembly sandbox’ı üzerinden performans ile güvenliği garanti eder.

GN⁺ Özeti

Bu yazı, QuickJS motorunu kullanarak JavaScript kodunun bir WebAssembly sandbox’ı içinde güvenli şekilde nasıl çalıştırılacağını açıklıyor. Bu yaklaşım, güvenilmeyen kodu izole edip çalıştırmak için oldukça kullanışlıdır. QuickJS hafif olmasının yanında hızlı performans da sunar ve TypeScript projeleriyle kolayca entegre edilebilir. Benzer işlevler sunan projeler arasında Deno ve Node.js bulunur.

1 yorum

 
GN⁺ 2024-07-08
Hacker News görüşleri
  • quickjs-emscripten kütüphanesinin yazarı, kütüphanenin standart kütüphanesini övüyor

    • Tarayıcıda veya bir bundler içinde çalıştırıp çalıştırmadığını soruyor
    • Webpack gibi bundler'larla uyumluluk sorunlarına dikkat çekiyor
    • Güvenlik uyarısı: kütüphane, misafir kodun ana makinenin fetch fonksiyonuyla aynı cookie'leri kullanarak fetch çağırabilmesine izin veriyor
    • Güvenilmeyen kod çalıştırırken dikkatli olunması gerektiğini söylüyor
    • quickjs-emscripten'ın düşük seviyeli olmasının ve sihirli görünen özelliklerden kaçınmasının nedeninin güvenliği garanti altına almak olduğunu belirtiyor
    • Güvenilmeyen kod çalıştırırken sandbox ve API'nin dikkatle denetlenmesi gerektiğini söylüyor
    • Figma'nın eklenti sandbox güvenliği hakkındaki blog yazısına bakılmasını öneriyor
  • Önceki iş yerinde quickjs-emscripten kullanırken çok sayıda "segmentation fault" ve hata yaşadığını söylüyor

    • Proje durdurulmuş ve bugün yeniden yapsa resmî olarak desteklenen wasm bundle'ını kullanacağını belirtiyor
  • JavaScript'i sandbox içine almanın birkaç yolu olduğunu söylüyor

    • DOM erişimini sandbox içine almanın bir yolu olup olmadığını soruyor
    • Tekniğin yalnızca iframe'ler olduğunu, ancak bunların ağır ve yavaş olduğunu söylüyor
    • Eklenti barındıran bir uygulama yazdığını ve eklentilere DOM erişimi verilirse bunun sorun çıkarabileceğini belirtiyor
  • Bunun tarayıcıda çalışıp çalışamayacağını soruyor

    • Desteklenen ortamlarla ilgili bir ifade bulamadığını söylüyor
  • quickjs kullandığını ama sonunda isolated-vm'i seçtiğini söylüyor

    • Her iki kütüphanenin de güvenlik gereksinimlerini karşıladığını, ancak isolated-vm'in performans açısından daha iyi olduğunu belirtiyor
  • Başka bir JS sandbox kütüphanesinin yazarı, quickjs-emscripten yaklaşımını ilginç buluyor

    • JS-in-JS veya JS-in-WASM'in yüksek düzeyde izolasyon sağladığını söylüyor
    • Node.js'in izolasyon ve sandbox göz önünde bulundurularak tasarlanmadığına dikkat çekiyor
    • createRuntime'ın fetch dışında ana makine ortamına yapılacak çağrıları tanımlayıp tanımlayamadığını soruyor
    • Tarayıcı desteğinin faydalı olacağını söylüyor
  • Bu kütüphane üzerinden kullanıcıların sağladığı JS kodunu çalıştırabileceğini düşünüyor

    • Bir bundler'ı sandbox ortamında çalıştırmaya dair öneri istiyor
  • QuickJS performansının ana JS VM ile rekabet edemeyeceğini söylüyor

    • Eski bir C yorumlayıcısından veya JavaScript ile yazılmış yorumlayıcılardan daha hızlı olduğunu belirtiyor
  • quickjs-emscripten için yüksek seviyeli bir wrapper üzerinde çalıştığını söylüyor

    • quickjs-emscripten API'sinin quickjs'in C API'sine çok benzediğini ve bu yüzden kullanımının zor olduğunu belirtiyor
    • require() desteğini uygulamanın zor olduğunu söylüyor
    • Modül dosyalarını bellek içi dosya sistemine önceden yükleme yöntemini kullandığını belirtiyor
  • quickjs-emscripten-sync kütüphanesinin ana makine ve misafir fonksiyonlarını otomatik senkronize ettiğini, bunun da geniş bir saldırı yüzeyi oluşturabileceğini söylüyor

    • Sandbox'tan kaçış ihtimali konusunda endişe duyuyor
  • wasm'a derlendiği için bunun tarayıcıda çalışıp çalışamayacağını soruyor

    • Cookie eklemeden fetch isteği yapmanın mümkün olup olmadığını merak ediyor