有哪些选项可以在node.js中安全地运行(可能是恶意的)用户提交的脚本?即在一个防止代码访问敏感数据和API的环境中? vm.runInNewContext(userScript, {})是一个诱人的起点......但似乎存在已知问题。 sandbox模块看起来很有趣,但也使用了runInNewContext(),所以我有点不放心。
您应该始终在一个单独的进程中运行不受信任的代码,这正是沙盒模块所做的。简单的原因是 vm.runInNewContext('while(true){}', {}) 会冻结Node。它首先会生成一个单独的进程,稍后将在其标准输出中将结果序列化为JSON格式发送。无论子进程做什么,父进程都会继续执行,并且可以触发超时机制。接下来,将不受信任的代码封装在一个闭包中并使用严格模式进行了包装。最后,传递一个非常有限的global对象以防止访问Node的API。不受信任的代码只能进行基本计算,没有文件或套接字的访问权限。虽然建议您阅读沙盒的代码,但我不建议直接使用它: 该代码已经过时,7个月未更新。 Node中的Child Process模块已经提供了大多数所需功能,特别是child_process.fork()。 child_process.fork提供的IPC通道可能具有更好的性能。 为了增加安全性,您还可以考虑使用setuid-sandbox。这是Google Chrome用于防止选项卡进程访问文件系统的代码。您需要制作一个本地模块,但是这个例子似乎很简单。
vm
,因为它是 Node 核心的一部分。由于 Node 核心往往会修复其错误,所以可以假定问题将得到解决。 - Raynos