Vm2: ¿Alguna razón por la cual la mayoría de los módulos integrados se envían por proxy en lugar de ser necesarios en la zona de pruebas?

Creado en 17 oct. 2017  ·  5Comentarios  ·  Fuente: patriksimek/vm2

Hola,
Estoy tratando de averiguar por qué los módulos integrados se transmiten desde el host y no se requieren en la máquina virtual.

esta es mi configuración actualmente:

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

vm.run(...);

dentro de la VM requiero un módulo externo ( axios si eso importa) y en la cadena de dependencias requiere otro módulo ( follow-redirects ) que hace esto (más o menos):

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

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

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

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

ejecutar este código dentro de la máquina virtual arroja: TypeError: 'set' en el proxy: la trampa devolvió falso para la propiedad '_performRequest'.
El objeto de flujo se envía por proxy a la máquina virtual.

ejecutar este código cuando realmente se requiere stream dentro de la máquina virtual (eliminando la declaración if aquí: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133) es trabajando.

ejecutando el nodo 6.10.3 en osx.

Gracias

stale

Comentario más útil

También encontré una solución alternativa (una que creo que se ajusta mejor al paradigma).

Básicamente, lo que encontré fue que el código contextualizado intentaba escribir en un prototipo de un objeto que creó en su contexto, pero que extendía un objeto traído de otro contexto.

Según la documentación sobre el controlador de conjunto de proxy, si la propiedad no existe en el objeto que intenta configurar, se llamará al controlador de conjunto prototipo.

Entonces;
Objeto
prototipo
a <-Configurar esto (que en realidad no existe en el prototipo)
__proto__ (apoderado)
set: (){} <- En realidad llama a esto

Y cuando se llama al controlador de conjunto, el argumento del receptor se establecerá en el objeto original que estábamos tratando de configurar. Mi solución fue esta:

--- 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;
+
+   },

Todos 5 comentarios

relacionado con #127

Seguí adelante y cambié la declaración if a:

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

Descubrí que en el nodo 8.x me encontré con problemas con async_hooks

También encontré una solución alternativa (una que creo que se ajusta mejor al paradigma).

Básicamente, lo que encontré fue que el código contextualizado intentaba escribir en un prototipo de un objeto que creó en su contexto, pero que extendía un objeto traído de otro contexto.

Según la documentación sobre el controlador de conjunto de proxy, si la propiedad no existe en el objeto que intenta configurar, se llamará al controlador de conjunto prototipo.

Entonces;
Objeto
prototipo
a <-Configurar esto (que en realidad no existe en el prototipo)
__proto__ (apoderado)
set: (){} <- En realidad llama a esto

Y cuando se llama al controlador de conjunto, el argumento del receptor se establecerá en el objeto original que estábamos tratando de configurar. Mi solución fue esta:

--- 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;
+
+   },

¿Cuál es el estado? ¿Proyecto muerto?

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

KonradLinkowski picture KonradLinkowski  ·  10Comentarios

wojpawlik picture wojpawlik  ·  4Comentarios

unxcepted picture unxcepted  ·  11Comentarios

patriksimek picture patriksimek  ·  5Comentarios

XmiliaH picture XmiliaH  ·  19Comentarios