调用未知函数时的 Node JS 安全性

分享于2022年07月17日 node.js 问答
【问题标题】:调用未知函数时的 Node JS 安全性(Node JS security when invoking an unknown function)
【发布时间】:2022-01-26 00:17:48
【问题描述】:

我有一种情况,我需要在服务器上运行一个动态函数(以字符串表示),我从生成数据的客户端接收到:

const functionFromClient = `return { id: 1 }`;

const getData = new Function('params', functionFromClient);

console.log(getData(params));

我们是否有办法清理函数,使其不运行可能损害服务器的代码?

  • 没有简单的方法可以在 nodejs 中清理外部代码以确保安全,因为随机代码可以通过 nodejs 完全访问系统。我知道的唯一可行的解​​决方案是在单独的沙盒虚拟机中运行代码。
  • 如果您告诉我们整体问题是什么以及为什么要引入外来代码,那么也许我们可以提供一些其他解决方案,不会有这些漏洞。例如,客户端提供可由服务器上的代码处理的数据的解决方案通常可以概括为涵盖很多情况。
  • @jfriend00 我们有一个案例,用户可以传递一个动态函数。服务器调用该函数并传递参数。这不能在客户端完成,因为我们必须在客户端加载为该函数生成参数的库,这是一项繁重的任务。
  • 我建议您更改该架构,以便用户传递描述他们希望做什么的数据,并且您的服务器包含可以处理他们传递的数据的所有可能排列的代码。您根本无法在服务器上安全地运行客户端提供给您的代码。你需要一个不同的设计。如果是您的客户端代码,那么您知道客户端可能生成的所有可能代码,您可以将该逻辑移至服务器,客户端可以向您传递一些数据,指示他们想要执行的代码类型。

【解决方案1】:

在 nodejs 中运行时,没有简单的方法来清理外部代码以确保安全,因为随机代码可以通过 nodejs 完全访问系统。据我所知,在您的服务器上运行的唯一可行解决方案是在单独的沙盒虚拟机中运行代码。

我建议您更改架构,以便客户端传递描述他们希望执行的操作的数据,并且您的服务器包含可以处理它们传递的数据的所有可能排列的代码,并在本地运行适当的代码来处理该数据.

您根本无法在服务器上安全地运行客户端提供给您的代码。你需要一个不同的设计。如果是您的客户端代码,那么您知道客户端可能生成的所有可能代码,您可以将该逻辑移至服务器,客户端可以向您传递一些数据,指示他们想要执行的代码类型,服务器可以运行正确的算法来处理该数据。这就是此类问题通常以安全的方式解决的方式。

如果您真的想在 nodejs 中安全地运行实际人类用户编写的代码,那么您必须在客户端自己的浏览器中运行它,或者在某种类型的 VM 沙箱中在与服务器不同的进程中运行它,以防止代码不会造成任何伤害。