javascript - 如何在 node.js 沙箱中安全地运行用户提交的脚本?

标签 javascript node.js v8

有哪些选项可以安全地在 node.js 中运行(可能是恶意的)用户提交的脚本? IE。在阻止代码访问敏感数据和 API 的环境中?

vm.runInNewContext(userScript, {}) 是一个诱人的起点……但似乎有 known issues在那里。

sandbox module看起来很有趣,但也使用 runInNewContext() 所以我有点怀疑。

最佳答案

您应该始终在单独的进程中运行不受信任的代码,这正是沙盒模块所做的。一个简单的原因是 vm.runInNewContext('while(true){}', {}) 会卡住 Node 。

它首先生成一个单独的进程,该进程稍后会将序列化的结果发送到其标准输出上的 JSON。无论子进程做什么,父进程都会继续执行,并且可以触发超时。

然后将不受信任的代码包装在带有 strict mode 的闭包中(在常规 JavaScript 中,您可以使用 arguments.callee.caller 访问范围之外的数据)。最后,传递一个非常有限的 global 对象以防止访问 Node 的 API。不受信任的代码只能进行基本计算,无法访问文件或套接字。

虽然您应该阅读沙盒的代码作为灵感,但我不建议按原样使用它:

  • 代码变旧,7 个月未更新。
  • node 中的 Child Process 模块已经提供了您需要的大部分功能,尤其是 child_process.fork() .
  • child_process.fork 提供的 IPC channel 可能性能更好。

为了提高安全性,您还可以考虑使用 setuid-sandbox .这是谷歌浏览器用来阻止标签进程访问文件系统的代码。你必须制作一个原生模块,但是这个 example看起来很简单。

关于javascript - 如何在 node.js 沙箱中安全地运行用户提交的脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7446729/

相关文章:

javascript - 在 angularjs 中使用 require : any alternative

javascript - Node/Express BodyParser 不从输入字段返回数据或返回 "undefined"

javascript - 在 V8 中集成 seb API(setTimeout、fetch 等)的最佳方式是什么

c++ - 从子线程访问指针

javascript - 从 Node 转储 v8 JIT 输出

javascript - javascript中的回溯,无法更新全局变量

javascript - 如何在 div 等其他元素上使用 Angular 表单验证?

javascript - 从 EPOS 浏览器发送数据 USB 端口

javascript - NodeJS 中的 Axios.all 失败并出现 404 错误

javascript - 使用 JavaScript 检查重复数据