在 node 中运行(可能是恶意的)用户提交的脚本的选项有哪些.js,安全吗?也就是说,在一个阻止代码访问敏感数据和API的环境中?

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

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

推荐答案

您应该始终在单独的进程中运行不受信任的代码,这正是sandbox模块所做的.一个简单的原因是vm.runInNewContext('while(true){}', {})将冻结 node .

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

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

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

  • 代码越来越旧,已经7个月没有更新了.
  • node中的子流程模块已经提供了所需的大部分功能,尤其是child_process.fork()个.
  • child_进程提供的IPC通道.fork可能有更好的性能.

为了提高安全性,还可以考虑使用setuid-sandbox.这是谷歌Chrome用来阻止标签进程访问文件系统的代码.您必须创建一个本机模块,但这似乎很简单.

Node.js相关问答推荐

如何使用updateMany()和Node.js的方法?

如何使用NodeJS处理来自请求的单个或多个文件?

创建查询以展开数组并筛选出具有特定值的元素之后的元素

npm错误;无法解析依赖项:npm ERR!对等webpack@;5.x.x;来自@webpack-cli/serve@2.0.5";

从mongodb集合中获取每分钟数据的每小时数据

编写动态创建的 YAML - 为生态系统创建 Docker compose 文件(使用 js-yaml)

我如何在nodejs中的路由之间交换令牌

在生产环境中,Nest实例启动时抛出不完整的导入错误

TypeError:在使用 Jest、Supertest、Express、Typescript 进行测试时无法读取未定义的属性(读取listen)

访问 Mongoose 查询之外的变量

aws cdk 2.0 init 应用程序无法构建更漂亮的问题,这来自 jest-snapshot

等价于 Node.js 的 Rails 控制台

如何以编程方式检测nodejs中的调试模式?

用于排除多个文件的 node.js glob 模式

ChildProcess 关闭、退出事件之间的区别

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

Node.js:如何附加到正在运行的进程并使用控制台调试服务器?

Node.js 与 .net 中的异步/等待

使用 Mongoose 进行多对多映射

将 NodeJS 用于大型项目