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

Broofa:

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

vm.runInNewContext(userScript, {})是一个诱人的起点...但是似乎那里存在已知问题

沙箱模块看起来很有趣,但使用runInNewContext()也使我的有点持怀疑态度。

洛朗·佩林:

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

它从产生一个单独的进程开始,随后将在其stdout上将序列化的结果发送到JSON。无论孩子做什么,父进程都会继续执行,并且可能触发超时。

然后,将不受信任的代码包装在严格模式下的闭包中(在常规JavaScript中,您可以arguments.callee.caller用来访问范围之外的数据)。最后,global传递一个非常有限的对象以防止访问节点的API。不受信任的代码只能执行基本计算,而不能访问文件或套接字。

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

  • 该代码越来越旧,并且已经有7个月没有更新了。
  • 节点中的“子进程”模块已经提供了您需要的大多数功能,尤其是child_process.fork()
  • child_process.fork提供的IPC通道可能具有更好的性能。

为了提高安全性,您还可以考虑使用setuid-sandbox这是Google Chrome浏览器用来防止制表符进程访问文件系统的代码。您必须制作一个本机模块,但是此示例似乎很简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何动态并发安全地加载JS脚本?

如何安全地从脚本中删除超时?

如何安全地在行中运行多个查询?

如何在Spotfire IronPython脚本中安全地将临时文件用于Web?

如何在Shell脚本中安全地反向IP上的dns查找

如何在EC2引导脚本中安全地传递密码?

如何在 ruby 客户端脚本中安全地存储身份验证凭据?

如何在爬虫中安全地使用用户输入的凭据?

安全地沙箱并执行用户提交的JavaScript?

如何安全地退出bash脚本?

如何在javascript中安全地向正在运行的函数发送消息

如何安全地登录用户

如何从多线程C ++ Linux应用程序安全地运行Shell脚本?

如何在我的Web应用程序上安全地接受和运行用户代码?

如何在我的Web应用程序上安全地接受和运行用户代码?

如何在python中安全地计算字典键

如何在 CircleCI 中安全地使用 Gemfury 令牌?

如何在Meteor中安全地更改密码?

如何在Java中安全地访问数组线程?

如何在Python中安全地停止无限循环?

如何在 Python 中安全地创建嵌套目录?

您如何在Golang中安全地提供文件

如何在Python包中安全地“伪造”模块

如何在RedShift中安全地卸载/复制表?

如何在php中安全地取消链接文件?

如何在MySQL中安全地存储HTML数据?

如何在JupyterLab中安全地停止无限循环?

如何在Java中安全地使用并行流?

如何在StencilJS组件中安全地操作DOM?