当前位置: 首页 > 面试题库 >

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

祖迪
2023-03-14
问题内容

在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浏览器用来防止制表符进程访问文件系统的代码。您必须制作一个本机模块,但是此示例似乎很简单。



 类似资料:
  • 问题内容: 我希望能够让用户提交任意JavaScript代码,然后将其发送到Node.JS服务器并安全地执行,然后再将输出发送回多个客户端(如JSON)。该功能浮现在脑海,但是我知道这涉及多个安全问题(用户提交的代码将能够访问Node的File API等)。我已经看到了一些项目,例如Microsoft Web Sandbox和Google Caja,它们允许执行经过清理的标记和脚本(用于在网站上嵌

  • 问题内容: 我正在创建要执行的JEXL脚本的沙箱,以使恶意用户无法访问我们为其提供访问权限的变量之外的数据,也无法在服务器上执行DOS攻击。我想为其他这样做的人提供文档,也让其他人对此方法有所投入。 以下是我知道需要解决的问题的列表: 仅允许使用白名单上的“ new”实例化类。 不允许访问任何类的getClass方法,因为这样便可以调用forName并且可以访问任何类。 限制对文件等资源的访问。

  • 问题内容: 我们的Java应用程序的一部分需要运行由非开发人员编写的javascript。这些非开发人员正在使用JavaScript进行数据格式化。(主要是简单的逻辑和字符串连接)。 我的问题是如何设置这些脚本的执行,以确保脚本错误不会对应用程序的其余部分产生重大负面影响。 需要防范无限循环 防止产生新线程。 限制访问服务和环境 文件系统(示例:如果心怀不满的脚本编写者决定删除文件) 数据库(用同

  • 我目前正在尝试使用谷歌表单和应用程序脚本制作一个文书向导。在表单的末尾,我尝试在表单提交并显示HTML窗口后运行应用程序脚本。我试着使用以及应用程序事件触发器,但我一直收到错误

  • {“response_envelope”=>{“timestamp”=>“2015-10-06T22:55:49.604-07:00”,“ack”=>“success”,“correlation_id”=>“9f0f563554297”,“build”=>“17820627”},“currency_code”=>“usd”,“refund_info_list”=>{“refund_info”=>[

  • 问题内容: 问题 我有一个表单,提交后将运行基本代码来处理提交的信息,并将其插入数据库中以显示在通知网站上。此外,我还有一个列表,他们注册了通过电子邮件和SMS消息接收这些通知的人员。此列表暂时是微不足道的(仅推送约150个),但是足以导致花费一分钟以上的时间在整个订户表中循环并发送150多个电子邮件。(由于批量电子邮件政策,电子邮件是根据我们的电子邮件服务器的系统管理员的要求单独发送的。) 在此