Sprint 15.1: Dynamic import() in Page-Sandbox ausführen #71
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#71
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Dynamic
import()— Sandboxed Module ExecutionPriorität: Niedrig (~0.5% der Seiten)
Abhängigkeit: Sprint 14 (new Function Sandbox) ✅
Problembeschreibung
import('https://cdn.example.com/module.js')läuft aktuell via Bun's nativemimport(), was im globalen Bun-Scope ausgeführt wird. Module haben Zugriff aufBun,process,Bufferetc. — die Sandbox wird umgangen.Betroffene Seiten: Seltene Fälle von ES Module CDN-Ladern (z.B.
import('https://esm.sh/react'))Architektur-Analyse
Aktueller Ablauf:
Gewünschter Ablauf:
Lösungsansätze
Option A: window.import überschreiben (EMPFEHLUNG)
import()ist ein "pseudo-keyword" und kann NICHT direkt überschrieben werden. Aber: Webpack/Rollup outputten nie rawimport()— sie transpilieren zu UMD oder IIFE. Nur ES Module-native Seiten (selten) nutzen es.Wir können das Syntax-Keyword
importnicht intercepten. Alternative: Den Module-Loader von Bun patchen.Option B: Bun's native Module-Hooks nutzen (Bun API)
Vorteil: Bun-nativ, funktioniert für alle import()-Aufrufe
Nachteil: Nur mit Bun-Know-how, kein Standard
Option C: Transparent Proxy via new Function() Override
Wenn der Module-Code via
import()geladen wird und dannnew Function()oder eval benutzt, fängt Sprint 14 das bereits ab. Für reine Module ohne dynamic eval: nicht ausreichend.Entscheidung
Option B — Bun-spezifischer Module Plugin. Bun bietet
Bun.plugin()und Module-Hooks die wir nutzen können. Allerdings:import()in Bun läuft via JavaScriptCore's internal module loaderimport,export) sind Lexical Declarations — können nicht viawith()shadowed werdenEinfachere Alternative: Akzeptieren dass
import()nicht voll sandboxed werden kann und als Known Limitation dokumentieren — wie(0,eval).Akzeptanzkriterien
import()läuft im with(_win)-Scopeexportwird korrekt nach aussen gereichtBetroffene Dateien
src/js/execution-realm.tsexecuteModule()— Module via Realm statt nativem import()tests/unit/sprint15-import-sandbox.test.tsDependencies
Technische Risiken
import/exportsind nicht shadowable via with()Performance-Impact
Minimal —
import()wird selten genutzt (Webpack/Rollup outputten UMD/IIFE).✅ Sprint 15 implementiert — Dynamic import() Sandbox
var-Blocker im Module-Scope:Bun,process,Buffer,requiresindvoid 0_wingemerged (Object.assign)_win.import = void 0in Realm-Initialisierung(0, eval))558297b