Vm2: Unterstützung für die Ausführung von VM2 im Browser

Erstellt am 31. Juli 2017  ·  15Kommentare  ·  Quelle: patriksimek/vm2

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

  • 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.
feature request help wanted

Hilfreichster Kommentar

Ich denke darüber nach, Web-Worker zu verwenden, um VM2 in Browsern zum Laufen zu bringen. Ich versuche es mal.

Alle 15 Kommentare

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?

227 ist von Interesse, zumal Realms speziell für das Browser-Sandboxing erwähnt wurde.

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.js

Verwendung

<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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

wintertime-inc picture wintertime-inc  ·  5Kommentare

vshymanskyy picture vshymanskyy  ·  8Kommentare

keyosk picture keyosk  ·  64Kommentare

wojpawlik picture wojpawlik  ·  4Kommentare

somebody1234 picture somebody1234  ·  4Kommentare