HN publié : exécuter JavaScript dans un sandbox QuickJS WebAssembly
(github.com/sebastianwessel)QuickJS - Exécuter JavaScript dans un sandbox QuickJS WebAssembly
Ce package TypeScript permet d’exécuter du code JavaScript en toute sécurité dans un sandbox WebAssembly à l’aide du moteur QuickJS. Il convient particulièrement à l’isolation et à l’exécution sécurisées de code non fiable, et fournit un environnement d’exécution robuste grâce au moteur QuickJS, léger et rapide, compilé en WebAssembly.
Fonctionnalités
- Sécurité : permet d’exécuter du code JavaScript non fiable dans un environnement sûr et isolé
- Système de fichiers : permet de monter un système de fichiers virtuel
- Modules Node personnalisés : permet de monter des modules Node personnalisés
- Client Fetch : permet de fournir un client fetch capable d’effectuer des appels http(s)
- Test runner : inclut un test runner ainsi que
expectbasé sur chai - Performance : permet de bénéficier des avantages du moteur QuickJS, léger et efficace
- Polyvalence : s’intègre facilement dans des projets TypeScript existants
- Simplicité : fournit une API conviviale pour exécuter et gérer du code JavaScript dans le sandbox
Voir la documentation complète
Trouver des exemples dans le dépôt
Utilisation de base
Voici un exemple simple d’utilisation du package :
import { quickJS } from '@sebastianwessel/quickjs'
// Configuration générale, comme le chargement et l'initialisation de QuickJS wasm
// Comme il s'agit d'une opération gourmande en ressources, il faut si possible ne l'effectuer qu'une seule fois
const { createRuntime } = await quickJS()
// Une instance de runtime est créée à chaque exécution de code js
const { evalCode } = await createRuntime({
allowFetch: true, // injecte fetch et autorise le code à récupérer des données
allowFs: true, // monte un système de fichiers virtuel et fournit le module 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')) // affiche "src/dist" dans les logs sur le système hôte
console.log(env.MY_ENV_VAR) // affiche "env var value" dans les logs sur le système hôte
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' }
Crédits
Cette bibliothèque s’appuie sur :
- quickjs-emscripten
- quickjs-emscripten-sync
- memfs
- Chai
Outils utilisés :
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
Licence
Ce projet est distribué sous licence MIT.
Ce package est idéal pour les développeurs qui veulent exécuter du code JavaScript en toute sécurité dans des applications TypeScript, tout en garantissant performances et sûreté grâce au sandbox QuickJS WebAssembly.
Résumé de GN⁺
Cet article explique comment exécuter du code JavaScript en toute sécurité dans un sandbox WebAssembly à l’aide du moteur QuickJS. C’est particulièrement utile pour isoler et exécuter du code non fiable. QuickJS offre des performances rapides tout en restant léger, avec l’avantage de pouvoir être facilement intégré dans des projets TypeScript. Parmi les projets offrant des fonctionnalités similaires, on peut citer Deno et Node.js.
1 commentaires
Avis Hacker News
L’auteur de la bibliothèque quickjs-emscripten fait l’éloge de la bibliothèque standard de la bibliothèque
fetchen utilisant les mêmes cookies que la fonctionfetchde l’hôteDans un emploi précédent, il a rencontré de nombreuses « segmentation faults » et erreurs en utilisant quickjs-emscripten
Il existe plusieurs façons de sandboxer JavaScript
Demande si cela peut s’exécuter dans le navigateur
Il a essayé quickjs mais a finalement choisi isolated-vm
L’auteur d’une autre bibliothèque de sandbox JS trouve l’approche de quickjs-emscripten intéressante
createRuntimepeut définir des appels vers l’environnement hôte autres quefetchPense que cette bibliothèque permettrait d’exécuter du code JS fourni par l’utilisateur
Mentionne que les performances de QuickJS ne peuvent pas rivaliser avec celles de la VM JS hôte
Il travaillait sur un wrapper de haut niveau pour quickjs-emscripten
require()est difficileLa bibliothèque quickjs-emscripten-sync fournit une synchronisation automatique entre les fonctions hôte et invité, ce qui peut constituer une grande surface d’attaque
Demande si, puisqu’elle a été compilée en wasm, elle peut s’exécuter dans le navigateur