javascript / expert
Snippet
Isolierte Skriptausführungs-Sandbox mittels Node.js-VM-Kontexten
Das Modul node:vm bietet APIs zum Kompilieren und Ausführen von Code in isolierten V8-Kontextbereichen. Durch das Anbinden eines Objekts ohne Prototyp als globalen Proxy und das Definieren expliziter Ausführungs-Timeouts können Zugriffe unsicherer Skripte eingeschränkt und CPU-intensive Schleifen unterbrochen werden.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import vm from 'node:vm';function executeInSandbox(untrustedCode, contextGlobals) {const sandbox = vm.createContext(Object.create(null, {...Object.getOwnPropertyDescriptors(contextGlobals),Math: { value: Math, writable: false, configurable: false }}));const script = new vm.Script(untrustedCode, { filename: 'sandbox.vm.js' });return script.runInContext(sandbox, {timeout: 100,breakOnSigint: true});}const result = executeInSandbox('x * 2 + Math.PI', { x: 10 });
nodejs
Erklärung
1
const sandbox = vm.createContext(Object.create(null, {
Erstellt einen frischen V8-Ausführungskontext, der zur Isolation vom Standard-Object-Prototyp getrennt ist.
2
Math: { value: Math, writable: false, configurable: false }
Möglichst sichere Injektion unveränderlicher Primitiven über explizite Property-Deskriptoren.
3
const script = new vm.Script(untrustedCode, { filename: 'sandbox.vm.js' });
Kompiliert den Code-String vor der Ausführung in eine wiederverwendbare V8-Skriptinstanz.
4
timeout: 100,
Erzwingt ein alarmeigenes Zeitlimit in Millisekunden und wirft bei Überschreitung eine Exception.