1. SzenarioIch habe kürzlich an etwas Ähnlichem wie einem webbasierten Plug-in-System gearbeitet und dabei mit der JS-Sandbox herumgespielt, um Code aus Drittanbieteranwendungen auszuführen. 2. Grundfunktionen der Sandbox Vor der Implementierung (oder eigentlich nach der Recherche einiger Lösungen) wurde festgelegt, dass die Sandbox die Funktionen der oberen Ebene basierend auf Schnittstelle IEventEmitter exportieren { /** * Abhörereignis * @param-Kanal * @param-Handle */ ein (Kanal: Zeichenfolge, Handle: (Daten: beliebig) => ungültig): ungültig; /** * Abhören abbrechen * @param channel */ offByChannel(Kanal: Zeichenfolge): void; /** * Ereignis auslösen * @param Kanal * @param-Daten */ emittieren (Kanal: Zeichenfolge, Daten: beliebig): ungültig; } /** * Eine grundlegende JS-VM-Funktion */ Exportschnittstelle IJavaScriptShadowbox erweitert IEventEmitter { /** * Beliebigen Code ausführen * @param Code */ eval(Code: Zeichenfolge): ungültig; /** * Zerstöre die Instanz */ zerstören(): ungültig; } Neben der Fähigkeit zur Kommunikation sind zwei weitere Methoden erforderlich:
JavaScript-Sandbox-Diagramm: Im Folgenden zeigen wir, wie man mit 3. Iframe-Implementierung Ehrlich gesagt, wenn man über Sandboxen im Web spricht, denkt man wahrscheinlich als Erstes an Natürlich können Sie den JS-Code in HTML einbinden und dann ausführen Funktion evalByIframe(Code: Zeichenfolge) { const html = `<!DOCTYPE html><body><script>$[code]</script></body></html>`; const iframe = document.createElement("iframe"); iframe.Breite = "0"; iframe.Höhe = "0"; iframe.style.display = "keine"; Dokument.body.appendChild(iframe); const blob = neuer Blob([html], { Typ: "text/html" }); iframe.src = URL.createObjectURL(blob); Iframe zurückgeben; } evalByIframe(` document.body.innerHTML = "Hallo Welt" Konsole.log('Standort.href: ', Standort.href) Konsole.log('lokaler Speicher: ',lokaler Speicher) `); Aber
4. Web Worker-Implementierung Ein Funktion evalByWebWorker(Code: Zeichenfolge) { const blob = neuer Blob([Code], { Typ: "Anwendung/Javascript" }); const url = URL.createObjectURL(blob); gib neuen Worker(URL) zurück; } evalByWebWorker(` Konsole.log('Standort.href: ', Standort.href) // console.log('localStorage: ', localStorage) `); Aber gleichzeitig ist es tatsächlich besser als
5. Quickjs-Implementierung Die Hauptinspiration für die Verwendung Was ist Quickjs? Es handelt sich um eine JavaScript-Laufzeitumgebung. Die von uns am häufigsten verwendeten Laufzeitumgebungen sind zwar Browser und asynchrone Funktion evalByQuickJS(Code: Zeichenfolge) { const quickJS = warte auf getQuickJS(); const vm = quickJS.createVm(); const res = vm.dump(vm.unwrapResult(vm.evalCode(code))); vm.dispose(); Rückgabewert; } console.log(warte auf evalByQuickJS(`1+1`)); Vorteil:
Mangel:
6. FazitSchließlich haben wir uns entschieden, den EventEmitter von Web Worker und QuickJS basierend auf der Schnittstelle zu implementieren und die Möglichkeit zu unterstützen, jederzeit wechseln zu können. Dies ist das Ende dieses Artikels über die Erkundung von JavaScript-Sandboxen. Weitere relevante JavaScript-Sandbox-Inhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Detaillierte Erläuterung der CSS BEM-Schreibstandards
>>: Detaillierte Erklärung des MySQL-Triggerbeispiels
MySQL (5.6 und darunter) analysiert JSON #json-An...
Als ich mich bei MySQL anmeldete, wurde mir plötz...
Die Standard-MySQL-Version unter dem Alibaba Clou...
Websites mit einer Architektur wie LNMP werden im...
Ich möchte einen Artikel von Zhang Xinxu zitieren...
Ich habe heute MySQL 8.0 aktualisiert. Das erste ...
Apache: Virtuellen Host basierend auf Port erstel...
Ich erwarte nicht, ein erfahrener Datenbankadmini...
Der gemeinsam genutzte Speicher von Nginx ist ein...
Die Drag-Funktion wird hauptsächlich verwendet, u...
Die übliche Methode zum Bereitstellen eines Sprin...
Inhaltsverzeichnis Vorwort Start Ein kleiner Geda...
1. Prozentuale Basis für Elementbreite/-höhe/-pol...
Wenn über dieses Problem gesprochen wird, fragen s...
Vorwort Kürzlich trat in der Testumgebung ein Pro...