Vm2: Gibt es einen Grund, warum die meisten eingebauten Module Proxys sind, anstatt in der Sandbox erforderlich zu sein?

Erstellt am 17. Okt. 2017  ·  5Kommentare  ·  Quelle: patriksimek/vm2

Hallo,
Ich versuche herauszufinden, warum integrierte Module vom Host weitergeleitet werden und in der VM nicht erforderlich sind.

das ist mein setup aktuell:

const vm = new NodeVM({
        require: {
            external: true,
            context: 'sandbox',
            builtin: ['*'],
        },
    });

vm.run(...);

Innerhalb der VM benötige ich ein externes Modul ( axios falls das wichtig ist) und in der Kette der Abhängigkeiten benötigt es ein weiteres Modul ( follow-redirects ), das dies tut (mehr oder weniger):

var Writable = require('stream').Writable;

function RedirectableRequest(options, responseCallback) {
// .....
}

RedirectableRequest.prototype = Object.create(Writable.prototype);

RedirectableRequest.prototype._performRequest = function () {  // <-------- this line breaks
// ..........
}

Das Ausführen dieses Codes innerhalb der VM löst aus: TypeError: 'set' on proxy: trap hat für die Eigenschaft '_performRequest' einen falschen Wert zurückgegeben.
Das Stream-Objekt wird an die VM weitergeleitet.

Ausführen dieses Codes, wenn stream tatsächlich innerhalb der VM erforderlich ist (durch Entfernen der if-Anweisung hier: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133). Arbeiten.

Laufender Knoten 6.10.3 auf osx.

Danke

stale

Hilfreichster Kommentar

Ich habe auch eine alternative Lösung gefunden (eine, die meiner Meinung nach besser zum Paradigma passt).

Was ich im Grunde gefunden habe, war kontextbezogener Code, der versuchte, in einen Prototyp eines Objekts zu schreiben, das er in seinem Kontext erstellt hatte, der jedoch ein aus einem anderen Kontext eingebrachtes Objekt erweiterte.

Gemäß der Dokumentation zum Set-Proxy-Handler wird der Prototyp-Set-Handler aufgerufen, wenn die Eigenschaft für das Objekt, das Sie festlegen möchten, nicht vorhanden ist.

Damit;
Objekt
Prototyp
a <-Setting this (was beim Prototyp eigentlich nicht existiert)
__proto__ (Proxy)
set: (){} <- Ruft das eigentlich auf

Und wenn der Set-Handler aufgerufen wird, wird das Empfängerargument auf das ursprüngliche Objekt gesetzt, auf das wir setzen wollten. Meine Lösung war folgende:

--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
 const OPNA = 'Operation not allowed on contextified object.';
 const ERROR_CST = Error.captureStackTrace;
 const FROZEN_TRAPS = {
-   set: (target, key) => false,
+   set: (target, key, value, receiver) => {
+       if( target !== receiver ){
+
+           Object.defineProperty(receiver, key, {
+               value: value,
+               writable: true,
+               enumerable: true,
+               configurable: true
+           })
+
+           return true;
+
+       }
+
+       return false;
+
+   },

Alle 5 Kommentare

bezogen auf #127

Ich ging weiter und änderte die if-Anweisung in:

if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){

Ich habe festgestellt, dass ich in Knoten 8.x auf Probleme mit async_hooks gestoßen bin

Ich habe auch eine alternative Lösung gefunden (eine, die meiner Meinung nach besser zum Paradigma passt).

Was ich im Grunde gefunden habe, war kontextbezogener Code, der versuchte, in einen Prototyp eines Objekts zu schreiben, das er in seinem Kontext erstellt hatte, der jedoch ein aus einem anderen Kontext eingebrachtes Objekt erweiterte.

Gemäß der Dokumentation zum Set-Proxy-Handler wird der Prototyp-Set-Handler aufgerufen, wenn die Eigenschaft für das Objekt, das Sie festlegen möchten, nicht vorhanden ist.

Damit;
Objekt
Prototyp
a <-Setting this (was beim Prototyp eigentlich nicht existiert)
__proto__ (Proxy)
set: (){} <- Ruft das eigentlich auf

Und wenn der Set-Handler aufgerufen wird, wird das Empfängerargument auf das ursprüngliche Objekt gesetzt, auf das wir setzen wollten. Meine Lösung war folgende:

--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
 const OPNA = 'Operation not allowed on contextified object.';
 const ERROR_CST = Error.captureStackTrace;
 const FROZEN_TRAPS = {
-   set: (target, key) => false,
+   set: (target, key, value, receiver) => {
+       if( target !== receiver ){
+
+           Object.defineProperty(receiver, key, {
+               value: value,
+               writable: true,
+               enumerable: true,
+               configurable: true
+           })
+
+           return true;
+
+       }
+
+       return false;
+
+   },

Wie ist der Stand? Projekt tot?

Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivität gab. Es wird geschlossen, wenn keine weiteren Aktivitäten stattfinden. Vielen Dank für Ihre Beiträge.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen