2

我有一个用 JavaScript(node.js) 编写的应用程序服务器。我接受一个 JS 函数代码作为来自网络浏览器的输入。现在我希望能够在服务器上运行这个功能而不影响其他任何东西。

我想确保这个函数正在修改的所有变量都是函数的本地变量,并且不会影响服务器上的任何其他变量。

此外,我想以某种方式避免无限循环或递归以及任何其他不可预见的问题。

大多数情况下,我希望用户能够在我采取一些行动之前触发一些代码作为要运行的函数。

有任何想法吗 ?

4

2 回答 2

4

Sandbox是一个节点模块,根据 README;

  • 可用于执行不受信任的代码
  • 支持超时(例如防止无限循环)
  • 受限代码(无法访问 node.js 方法)

@maerics 所写的停止问题可以通过为代码设置超时来解决,尽管您不能在同一进程中这样做,因为例如while(1)会阻止它。沙盒通过使用子进程解决了这个问题。

因此,变量问题也应该得到解决,因为 Sandbox 位于子进程而不是主进程中。

如前所述,如果可能,您应该避免用户在您的服务器上运行任意代码,因为这会带来巨大的安全风险。即使模块提供了此限制,您也应该至少以尽可能无特权的用户运行子进程。

于 2013-03-02T17:02:05.260 回答
2

您无法以编程方式确定任意代码是否会无限期运行或终止。

这被称为停机问题

您可能能够防止任意 JS 代码修改变量,而不是通过在单独的进程中通过沙箱创建的变量。

无论哪种方式,接受在服务器上执行的任意代码都会给您的系统带来巨大的安全风险。仔细考虑如何避免它。

于 2013-02-15T16:23:13.750 回答