HN公開: WebAssembly QuickJSサンドボックスでJavaScriptを実行
(github.com/sebastianwessel)QuickJS - WebAssembly QuickJSサンドボックスでJavaScriptを実行
このTypeScriptパッケージは、QuickJSエンジンを使用してWebAssemblyサンドボックス内でJavaScriptコードを安全に実行できるようにします。信頼できないコードを安全に隔離して実行するのに適しており、WebAssemblyにコンパイルされた軽量で高速なQuickJSエンジンを活用して、堅牢なコード実行環境を提供します。
特徴
- セキュリティ: 信頼できないJavaScriptコードを安全で隔離された環境で実行可能
- ファイルシステム: 仮想ファイルシステムをマウント可能
- カスタムNodeモジュール: カスタムNodeモジュールをマウント可能
- Fetchクライアント: http(s) 呼び出しができるfetchクライアントを提供可能
- テストランナー: テストランナーとchaiベースの
expectを含む - パフォーマンス: 軽量で効率的なQuickJSエンジンの利点を活用可能
- 多様性: 既存のTypeScriptプロジェクトと簡単に統合可能
- シンプルさ: サンドボックス内でJavaScriptコードを実行・管理するための使いやすいAPIを提供
ドキュメント全体を見る
リポジトリでサンプルを探す
基本的な使い方
以下は、このパッケージを使う簡単な例です:
import { quickJS } from '@sebastianwessel/quickjs'
// QuickJS wasmのロードや初期化などの一般設定
// リソース集約的な処理のため、可能なら一度だけ実行すべき
const { createRuntime } = await quickJS()
// jsコードを実行するたびにランタイムインスタンスを生成
const { evalCode } = await createRuntime({
allowFetch: true, // fetchを注入し、コードがデータを取得できるよう許可
allowFs: true, // 仮想ファイルシステムをマウントし、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')) // ホストシステムで "src/dist" をログ出力
console.log(env.MY_ENV_VAR) // ホストシステムで "env var value" をログ出力
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
使用ツール:
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
ライセンス
このプロジェクトはMITライセンスの下で提供されています。
このパッケージは、TypeScriptアプリケーション内でJavaScriptコードを安全に実行したい開発者に最適であり、QuickJS WebAssemblyサンドボックスを通じて性能と安全性を保証します。
GN⁺の要約
この記事では、QuickJSエンジンを使用してWebAssemblyサンドボックス内でJavaScriptコードを安全に実行する方法を説明しています。これは、信頼できないコードを隔離して実行する際に非常に有用です。QuickJSは軽量でありながら高速な性能を提供し、TypeScriptプロジェクトと簡単に統合できる利点があります。類似の機能を提供するプロジェクトとして、DenoやNode.jsがあります。
1件のコメント
Hacker Newsのコメント
quickjs-emscriptenライブラリの作者が、このライブラリの標準ライブラリを評価している
fetch関数と同じCookieを使ってfetchを呼び出せてしまう前職でquickjs-emscriptenを使っていた際に、多くの"segmentation faults"やエラーを経験した
JavaScriptをサンドボックス化する方法はいくつもある
ブラウザで実行できるかと質問している
quickjsを使ってみたが、最終的にはisolated-vmを選んだ
別のJSサンドボックスライブラリの作者が、quickjs-emscriptenのアプローチを興味深いと考えている
createRuntimeでfetch以外にホスト環境への呼び出しを定義できるのかと質問しているこのライブラリによって、ユーザーが提供したJSコードを実行できるようになると考えている
QuickJSのパフォーマンスはホストのJS VMに太刀打ちできないと述べている
quickjs-emscriptenの高レベルラッパーに取り組んでいた
require()サポートの実装が難しいquickjs-emscripten-syncライブラリはホストとゲストの関数の自動同期を提供するが、これは大きな攻撃面になりうる
wasmにコンパイルされているため、ブラウザで実行できるのかと質問している