在 node 中运行(可能是恶意的)用户提交的脚本的选项有哪些.js,安全吗?也就是说,在一个阻止代码访问敏感数据和API的环境中?
vm.runInNewContext(userScript, {})
是一个诱人的起点...但那里似乎有known issues人.
sandbox module看起来很有趣,但也使用runInNewContext()
,所以我对它有点怀疑.
在 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的代码作为灵感,但我不建议按原样使用它:
为了提高安全性,还可以考虑使用setuid-sandbox.这是谷歌Chrome用来阻止标签进程访问文件系统的代码.您必须创建一个本机模块,但这似乎很简单.