【发布时间】:2022-01-26 00:17:48
【问题描述】:
我有一种情况,我需要在服务器上运行一个动态函数(以字符串表示),我从生成数据的客户端接收到:
const functionFromClient = `return { id: 1 }`;
const getData = new Function('params', functionFromClient);
console.log(getData(params));
我们是否有办法清理函数,使其不运行可能损害服务器的代码?
-
没有简单的方法可以在 nodejs 中清理外部代码以确保安全,因为随机代码可以通过 nodejs 完全访问系统。我知道的唯一可行的解决方案是在单独的沙盒虚拟机中运行代码。
-
如果您告诉我们整体问题是什么以及为什么要引入外来代码,那么也许我们可以提供一些其他解决方案,不会有这些漏洞。例如,客户端提供可由服务器上的代码处理的数据的解决方案通常可以概括为涵盖很多情况。
-
@jfriend00 我们有一个案例,用户可以传递一个动态函数。服务器调用该函数并传递参数。这不能在客户端完成,因为我们必须在客户端加载为该函数生成参数的库,这是一项繁重的任务。
-
我建议您更改该架构,以便用户传递描述他们希望做什么的数据,并且您的服务器包含可以处理他们传递的数据的所有可能排列的代码。您根本无法在服务器上安全地运行客户端提供给您的代码。你需要一个不同的设计。如果是您的客户端代码,那么您知道客户端可能生成的所有可能代码,您可以将该逻辑移至服务器,客户端可以向您传递一些数据,指示他们想要执行的代码类型。