gpt4 book ai didi

node.js - 如何获取Node vm2运行代码的结果

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:45 25 4
gpt4 key购买 nike

最近,我一直在尝试使用 @Patrik Šimek 发布的 vm2 包来实现沙箱执行

我正在尝试运行一些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)

最佳答案

您需要定义一个沙箱变量。声明一个空对象,将其附加到您的沙箱选项,并在脚本内向您的对象添加另一个属性。我想代码片段会说明一切:

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 );

关于node.js - 如何获取Node vm2运行代码的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45940654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com