Vm2: Une raison pour laquelle la plupart des modules intégrés sont proxy plutôt que d'être requis dans le bac à sable ?

Créé le 17 oct. 2017  ·  5Commentaires  ·  Source: patriksimek/vm2

Salut,
J'essaie de comprendre pourquoi les modules intégrés sont mandatés par l'hôte et ne sont pas requis dans la machine virtuelle.

voici ma configuration actuellement :

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

vm.run(...);

à l'intérieur de la machine virtuelle, j'ai besoin d'un module externe ( axios si cela compte) et dans la chaîne de dépendances, il faut un autre module ( follow-redirects ) qui fait cela (plus ou moins):

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

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

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

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

l'exécution de ce code à l'intérieur de la machine virtuelle génère : TypeError : 'set' sur le proxy : le piège a renvoyé un faux pour la propriété '_performRequest'.
L'objet de flux est mis en proxy vers la machine virtuelle.

exécuter ce code lorsque stream est réellement requis dans la machine virtuelle (en supprimant l'instruction if ici : https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133) est travaillant.

exécutant le nœud 6.10.3 sur osx.

Merci

stale

Commentaire le plus utile

J'ai également trouvé une solution alternative (celle qui, je pense, correspond mieux au paradigme).

Fondamentalement, ce que j'ai trouvé, c'est que le code contextifié essayait d'écrire dans un prototype d'un objet qu'il avait créé dans son contexte, mais qui étendait un objet importé d'un autre contexte.

Selon la documentation sur le gestionnaire de proxy set, si la propriété n'existe pas sur l'objet que vous essayez de définir, le gestionnaire de set prototype sera appelé.

Alors;
Objet
prototype
a <-Setting this (qui n'existe en fait pas sur le prototype)
__proto__ (proxy)
set : (){} <- appelle en fait ceci

Et lorsque le gestionnaire d'ensemble est appelé, l'argument du récepteur sera défini sur l'objet d'origine sur lequel nous essayions de définir. Ma solution était celle-ci :

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

Tous les 5 commentaires

lié à #127

Je suis allé de l'avant et j'ai changé l'instruction if en:

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

J'ai trouvé que dans le nœud 8.x, j'ai rencontré des problèmes avec async_hooks

J'ai également trouvé une solution alternative (celle qui, je pense, correspond mieux au paradigme).

Fondamentalement, ce que j'ai trouvé, c'est que le code contextifié essayait d'écrire dans un prototype d'un objet qu'il avait créé dans son contexte, mais qui étendait un objet importé d'un autre contexte.

Selon la documentation sur le gestionnaire de proxy set, si la propriété n'existe pas sur l'objet que vous essayez de définir, le gestionnaire de set prototype sera appelé.

Alors;
Objet
prototype
a <-Setting this (qui n'existe en fait pas sur le prototype)
__proto__ (proxy)
set : (){} <- appelle en fait ceci

Et lorsque le gestionnaire d'ensemble est appelé, l'argument du récepteur sera défini sur l'objet d'origine sur lequel nous essayions de définir. Ma solution était celle-ci :

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

Quel est le statut ? Projet mort ?

Ce problème a été automatiquement marqué comme obsolète, car il n'a pas eu d'activité récente. Il sera fermé s'il n'y a plus d'activité. Merci pour vos contributions.

Cette page vous a été utile?
0 / 5 - 0 notes