我对 NodeJS 中 VM 模块的用例感到困惑。
在阅读了有关此模块的文档中的一些内容后,它看起来像是一种进行 eval 的奇特方式。
有没有人使用过它并活着告诉尾巴它的用例?
最近,我一直在尝试使用vm2包来实现沙箱执行@Patrik \xc5\xa0imek 发布的
\n\n我正在尝试运行一些 js 代码,我认为它是自定义逻辑,我将此逻辑存储在一个字符串变量中。
\n\n我需要在沙箱环境中执行此自定义逻辑(因为这是不可信代码),并在实际环境中获取响应,以便根据此结果继续正常的应用程序流程。
\n\n我尝试了多种方法才得到最终结果。自定义逻辑在沙箱内成功执行,但我无法找到一种方法将此结果发送回主进程,但我得到的结果为未定义。因此,到目前为止,还没有任何效果。
\n\n希望我在这里得到一些答案。
\n\n自定义逻辑(将存储在字符串中)
\n\nfunction addValues(a,b){\n var c = a + b;\n console.log(\'Addition of 2 values\');\n console.log(c); \n return c;\n}\n\naddValues(10,10); // function call\nRun Code Online (Sandbox Code Playgroud)\n\n实际实施
\n\n// vm2 \n const {NodeVM} = require(\'vm2\');\n const vm = new NodeVM({\n console: \'inherit\',\n sandbox: {},\n require: {\n external: true,\n builtin: [\'fs\',\'path\'],\n root: "./",\n mock: {\n fs: {\n readFileSync() { return \'Nice try!\';}\n }\n },\n …Run Code Online (Sandbox Code Playgroud) 我正在使用VM2包来运行用户代码。我正在尝试拦截控制台输出并将 NodeVM 对象的控制台属性设置为“重定向”:
// Create a new sandbox VM for this request
const vm = new NodeVM( {
console: 'redirect',
timeout: 30000,
sandbox: { request, state, response },
require: {
external: true
}
});
Run Code Online (Sandbox Code Playgroud)
根据将控制台输出重定向到“事件”的文档。我是 NodeJS 的新手,如何连接到这些事件以捕获在沙箱内执行的 console.log 消息?
假设我们正在创建一个app通过构造新vm.SourceTextModule对象来调用的模块:
const context = {
exports: {},
console, // custom console object
};
const sandbox = vm.createContext(context);
const app = new vm.SourceTextModule(
`import path from 'path';
console.log(path.resolve('./src'));`,
{
context: sandbox,
}
);
Run Code Online (Sandbox Code Playgroud)
根据Node.js 文档,要从模块获取默认导出,path我们应该将模块导入的依赖项“链接”app到它。
为了实现这一点,我们应该将linker回调传递给app.link方法:
async function linker(specifier, referencingModule) {
// the desired logic...
}
await app.link(linker);
Run Code Online (Sandbox Code Playgroud)
如何linker正确实现功能,以便我们可以path在新创建的模块中导入模块app并使用它:
await app.evaluate(); // => /home/user/Documents/project/src
Run Code Online (Sandbox Code Playgroud)
PS 我们正在使用TypeScript,所以我检查了我们是否安装了path包的类型。
包.json …
我正在使用vm2在Node中运行一些沙盒代码。
正在运行的代码将大部分是异步的。它是不受信任的代码,并且不能以任何方式依赖它,因此,我为什么vm2要运行它。
vm2是否可以结束当前正在执行的任何代码?该文档非常有限。例如,如果我要使用以下代码:
var code = 'setInterval(function(){ console.log("tick"); }, 1000);'
vm.run(code);
Run Code Online (Sandbox Code Playgroud)
我有什么办法可以运行上述代码,并在将来的某个时候将其停止,而控制代码不必了解的内容code,也不必code提供任何特定功能?
我找不到vm.stop()方法或类似方法。
我正在使用该vm2模块,并且我有一些带有两个函数的代码:get_input()用于获取我拥有的一些数据,以及display()用于显示一些数据,但这些函数不会在该代码中定义。如何创建某种可以运行以get_input()从数组中提供数据并使用该display()函数将一些数据输出到我的主代码的外部函数?基本上我想这样做:
get_input()调用display(),将数据输出到我的主代码上的另一个数组任何帮助,将不胜感激。