Как получить результат кода, который запускается Node vm2

Недавно я пытался реализовать выполнение песочницы, используя пакет vm2, который был опубликован @Patrik Šimek

Я пытаюсь запустить некоторый код JS, который я считаю, что это пользовательская логика, я храню эту логику в строковой переменной.

Мне нужно выполнить эту пользовательскую логику в среде песочницы (так как это ненадежный код) и получить ответ в реальной среде, чтобы продолжить нормальный поток приложения на основе этого результата.

Я попробовал несколько методов, чтобы получить конечный результат. Пользовательская логика успешно выполняется внутри песочницы, но я не могу найти способ отправить этот результат обратно в основной процесс, но вместо этого я получаю результат как неопределенный. Поэтому пока ничего не получалось.

Надеюсь, я получу некоторые ответы здесь.

Пользовательская логика (которая будет храниться внутри строки)

function addValues(a,b){
   var c = a + b;
   console.log('Addition of 2 values');
   console.log(c); 
   return c;
}

addValues(10,10); // function call

Фактическая реализация

// vm2 
 const {NodeVM} = require('vm2');
        const vm = new NodeVM({
            console: 'inherit',
            sandbox: {},
            require: {
                external: true,
                builtin: ['fs','path'],
                root: "./",
                mock: {
                    fs: {
                        readFileSync() { return 'Nice try!';}
                    }
                },
                wrapper : ""
            }
        });


// Sandbox function
let functionInSandbox = vm.run("module.exports = function(customLogic){
                                    customLogic //need to execute this custom logic 
                               });



// Make a call to execute untrusty code by passing it as an argument
// to sandbox environment and obtain the result 

var resultOfSandbox =  functionInSandbox(customLogic);
console.log("Result of Sandbox  :");
console.log(resultOfSandbox); // undefined (need to get the result of custom logic execution)

2 ответа

Вам нужно определить переменную песочницы. Объявите пустой объект, добавьте его в ваш параметр песочницы и в вашем скрипте добавьте еще одно свойство к вашему объекту. Я думаю, что фрагмент кода будет говорить сам за себя:

const c = `
function addValues(a,b){
  var c = a + b;
  console.log('Addition of 2 values');
  console.log(c); 
  return c;
}

// we'll define ext as a sandbox variable, so it will be available
ext.exports = addValues(10,10); // function call
`;

let ext = {};
const { NodeVM } = require( 'vm2' );
const vm = new NodeVM( {
  console: 'inherit',
  // pass our declared ext variable to the sandbox
  sandbox: { ext },
  require: {
    external: true,
    builtin: ['fs', 'path'],
    root: './',
  },
} );

// run your code and see the results in ext
vm.run( c, 'vm.js' );
console.log( ext );

Этот код работает:

      let result = {};
code='output.testOut=1;';
const vm = new VM({
            timeout: 1000,
            allowAsync: false,
            sandbox: { ...data, output: result },
});
const script = new VMScript(code);
const r = vm.run(script);
console.log(result);
Другие вопросы по тегам