Zweigstelle: https://github.com/patriksimek/vm2/tree/feature-browsers
Bibliothek: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js
Verwendung
<script src="vm2.js"></script>
<script>
const vm = new vm2.VM();
alert(vm.run('Math.random()'));
</script>
Probleme
window.top
entkommen.MACHEN
NodeVM
aus der Browserversion.BrowserVM
zur Browserversion mit browserbezogenen Funktionen hinzu.Eine etwas hackige Lösung könnte das Umschreiben von AST beinhalten, um jeden Eigenschaftszugriff manuell zu verpacken. Zum Beispiel würde let x = foo.bar
in let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar)
umgeschrieben.
Hier ist ein Beispiel für AST - Rewriting, wo Funktionsaufruf Knoten in Knoten wie gewickelt werden diese .
Die Nachteile dieses Ansatzes sind, dass Sie den umgeschriebenen Code nicht einfach debuggen können und dass einige Problemumgehungen erforderlich sind, um mit Funktion, Auswertung und dergleichen umzugehen.
Ich denke, der einzige Weg ist sehr schwergewichtig, JS grundsätzlich selbst zu interpretieren oder Funktionskonstruktionen durch eine benutzerdefinierte Implementierung zu ersetzen (z. B. Injizieren von Variablen und Analysieren von Inhalten). Diese Methode wäre sehr schwer zu implementieren.
Das Löschen von Variablen ist aufgrund von Variablen wie document
und top
nicht möglich, die weder gelöscht noch überschrieben werden können.
@ io4 , das Ersetzen von Funktion, Auswertung und dergleichen zur Laufzeit ist mit AST-Umschreiben sicherlich möglich und auch nicht besonders schwierig. Es kommt jedoch zu einem starken Leistungseinbruch, sowohl zur "Kompilierungszeit", da Sie buchstäblich jeden Funktionsaufruf neu schreiben müssen, als auch zur Laufzeit, da Funktionsaufrufe eine Indirektionsebene durchlaufen müssen.
Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivitäten gab. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.
Bitte nicht schließen, dies ist ein relevantes Problem.
Ich denke darüber nach, Web-Worker zu verwenden, um VM2 in Browsern zum Laufen zu bringen. Ich versuche es mal.
Vielleicht können Sie es auch in einen Iframe mit Sandkasten legen. Auf diese Weise ist es immer noch auf den Frame beschränkt und kann nicht im Browserkontext der obersten Ebene navigieren.
Der Status ist, dass wir keine Web-Worker verwenden können, da diese keinen Speicher mit dem Host teilen. Ich habe den Sandbox-Iframe getestet, aber auch dort keinen Erfolg. Ohne die Option allow-same-origin
startet vm2 nicht einmal. Wenn diese Option aktiviert ist, kann ich auf das Fenster der obersten Ebene zugreifen. Aber ich gebe nicht auf :)
Was für einen Fehler hat es dir gegeben? Musste es auf eine Variable zugreifen? Vermisste es eine Bibliothek? Gibt es Daten, die durch den Austausch von Nachrichten zwischen Iframes abgerufen werden könnten?
Ich habe versucht, den Zugriff auf das Fenster mit dem gleichen Trick wie bei realms-shim zu reparieren.
Eine Implementierung finden Sie hier: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
Nachteil ist, dass alles in der VM im strengen Modus läuft.
@patriksimek , um das Problem window.top
umgehen. Könnten Sie das Objekt nicht beobachten und das Skript (Wurf und Fehler)
Zweigstelle: https://github.com/patriksimek/vm2/tree/feature-browsers
Bibliothek: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.jsVerwendung
<script src="vm2.js"></script> <script> const vm = new vm2.VM(); alert(vm.run('Math.random()')); </script>
Probleme
- Sandbox kann über
window.top
entkommen.MACHEN
- Entfernen Sie
NodeVM
aus der Browserversion.- Fügen Sie
BrowserVM
zur Browserversion mit browserbezogenen Funktionen hinzu.- Automatisierte Browsertests.
Ich kenne keine Möglichkeit, window
oder window.top
so zu beobachten, dass man werfen kann, bevor etwas passiert.
Hallo
Ich muss vm2.js als Modul in eine Typoskriptdatei importieren.
Kann mir bitte jemand helfen? Vielen Dank
Hallo
Ich muss vm2.js als Modul in eine Typoskriptdatei importieren.
Kann mir bitte jemand helfen? Vielen Dank
Arbeiten als Modul: module.exports = vm2;
am Ende der Datei hinzugefügt.
Hilfreichster Kommentar
Ich denke darüber nach, Web-Worker zu verwenden, um VM2 in Browsern zum Laufen zu bringen. Ich versuche es mal.