bro*_*ofa 41 javascript v8 node.js
安全地在node.js中运行(可能是恶意的)用户提交的脚本有哪些选项?即在一个阻止代码访问敏感数据和API的环境中?
vm.runInNewContext(userScript, {})
是一个诱人的起点......但似乎那里有已知的问题.
在沙箱模块看起来很有趣,但使用runInNewContext()
也使我有点持怀疑态度的吧.
Lau*_*rin 31
您应该始终在单独的进程中运行不受信任的代码,这正是沙盒模块所做的.一个简单的原因是vm.runInNewContext('while(true){}', {})
会冻结节点.
它首先生成一个单独的进程,稍后将在stdout上将结果序列化为JSON.无论子进程执行什么操作,父进程都会继续执行,并且可以触发超时.
然后将不受信任的代码封装在具有严格模式的闭包中(在常规JavaScript中,您可以使用arguments.callee.caller
访问范围之外的数据).最后,global
传递一个非常有限的对象以防止访问节点的API.不受信任的代码只能进行基本计算,并且无法访问文件或套接字.
虽然您应该阅读沙盒的代码作为灵感,但我不建议按原样使用它:
为了提高安全性,您还可以考虑使用setuid-sandbox.这是Google Chrome用于阻止标签流程访问文件系统的代码.你必须制作一个原生模块,但这个例子似乎很简单.
归档时间: |
|
查看次数: |
11680 次 |
最近记录: |