0

我试图在沙箱中运行用户提交的脚本来处理一些数据,然后通过 node-fetch 通过 http 请求将输出发送到指定的端点。但是,我不确定我是否做得正确,即使在阅读了 VM2 的文档之后,我也不能完全确定我需要配置哪些选项。

这是一个示例,我调用 process(); inputData 为{ a: 123 },userScript 将是下图所示的 sampleScript.js。

process(inputData, userScript) {
  const { NodeVM } = require('vm2');
  const vm = new NodeVM({
        console: 'inherit',
        sandbox: { content: inputData },
        require: { external: true },
        wrapper: 'none',
      });
  console.log(vm.run(userScript, 'node_modules'));
}

sampleScript.js

input = content;

function execute(data) {
  data['a'] *= 100;
  const fetch = require('node-fetch');
  await fetch(`webhook.site-endpoint`, {
      method: 'POST',
      body: JSON.stringify(data),
    });
}
execute(input);

我应该期待指定端点上的消息“12300”。但是,await fetch 方法调用似乎有问题,因为我在控制台上收到此错误:

(节点:36376)UnhandledPromiseRejectionWarning:错误:在 TCPConnectWrap.afterConnect [as oncomplete] 处连接 ECONNREFUSED 127.0.0.1:80(net.js:1141:16)(节点:36376)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict (请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。

这可能只是我配置沙箱选项的方式,因为我不确定我是否首先成功导入了 node-fetch 库。任何意见,将不胜感激!

4

0 回答 0