HN’de tanıtıldı: WebAssembly QuickJS sandbox’ında JavaScript çalıştırma
(github.com/sebastianwessel)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ı
expectiç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
Hacker News görüşleri
quickjs-emscriptenkütüphanesinin yazarı, kütüphanenin standart kütüphanesini övüyorfetchfonksiyonuyla aynı cookie'leri kullanarakfetchçağırabilmesine izin veriyorquickjs-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Önceki iş yerinde
quickjs-emscriptenkullanırken çok sayıda "segmentation fault" ve hata yaşadığını söylüyorJavaScript'i sandbox içine almanın birkaç yolu olduğunu söylüyor
iframe'ler olduğunu, ancak bunların ağır ve yavaş olduğunu söylüyorBunun tarayıcıda çalışıp çalışamayacağını soruyor
quickjskullandığını ama sonundaisolated-vm'i seçtiğini söylüyorisolated-vm'in performans açısından daha iyi olduğunu belirtiyorBaşka bir JS sandbox kütüphanesinin yazarı,
quickjs-emscriptenyaklaşımını ilginç buluyorcreateRuntime'ınfetchdışında ana makine ortamına yapılacak çağrıları tanımlayıp tanımlayamadığını soruyorBu kütüphane üzerinden kullanıcıların sağladığı JS kodunu çalıştırabileceğini düşünüyor
QuickJS performansının ana JS VM ile rekabet edemeyeceğini söylüyor
quickjs-emscripteniçin yüksek seviyeli bir wrapper üzerinde çalıştığını söylüyorquickjs-emscriptenAPI'sininquickjs'in C API'sine çok benzediğini ve bu yüzden kullanımının zor olduğunu belirtiyorrequire()desteğini uygulamanın zor olduğunu söylüyorquickjs-emscripten-synckü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üyorwasm'a derlendiği için bunun tarayıcıda çalışıp çalışamayacağını soruyor
fetchisteği yapmanın mümkün olup olmadığını merak ediyor