如何检查不受信任的代码是否可以安全执行?

How to check if untrusted code is safe to execute?

例如,我有一些 JS 函数的字符串表示形式,它是从用户那里收到的,应该在服务器端执行。

有什么方法可以检查这段代码是否可以安全执行?我所说的安全是指:仅使用自定义上下文和基本 类,不要尝试重新分配本机对象,不要尝试进行额外的网络调用或无限循环,等等。

以前我使用 NodeJSvm2 模块来达到这个目的。

您可以在没有 Deno 命名空间的情况下使用 Web Worker。

// deno property defaults to false
const worker = new Worker(new URL("worker.js", import.meta.url).href, { type: "module", deno: false });

您可以将字符串传递给 worker 并在内部传递 eval/Function。或者将用户代码保存到一个文件并使用该文件调用 Worker,您可以向用户代码添加一个包装器,这样您就可以 return 输出到主进程。

使用 deno: false 工作人员将无法访问 Deno 命名空间,因此用户将无法执行文件系统调用、启动服务器、读取环境变量等

关于无限循环,在主进程中添加一个计时器,如果 Worker 到那时还没有完成,则使用 .terminate()

终止它

关于fetch Web API,为了防止网络调用,你可以运行 deno without --allow-net flag 或者你可以限制对特定域的网络调用。 --allow-net=deno.land

这是不可能的。您所要求的相当于解决停机问题。

其实这部分你的要求是:

do not try to make […] infinite loops

不仅等同于停机问题,字面上 停机问题。

正如我们所知,停机问题是不可判定的,所以你想做的事情被证明是不可能的。