如何检查不受信任的代码是否可以安全执行?
How to check if untrusted code is safe to execute?
例如,我有一些 JS 函数的字符串表示形式,它是从用户那里收到的,应该在服务器端执行。
有什么方法可以检查这段代码是否可以安全执行?我所说的安全是指:仅使用自定义上下文和基本 类,不要尝试重新分配本机对象,不要尝试进行额外的网络调用或无限循环,等等。
以前我使用 NodeJS
的 vm2
模块来达到这个目的。
您可以在没有 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
不仅等同于停机问题,字面上 是 停机问题。
正如我们所知,停机问题是不可判定的,所以你想做的事情被证明是不可能的。
例如,我有一些 JS 函数的字符串表示形式,它是从用户那里收到的,应该在服务器端执行。
有什么方法可以检查这段代码是否可以安全执行?我所说的安全是指:仅使用自定义上下文和基本 类,不要尝试重新分配本机对象,不要尝试进行额外的网络调用或无限循环,等等。
以前我使用 NodeJS
的 vm2
模块来达到这个目的。
您可以在没有 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
不仅等同于停机问题,字面上 是 停机问题。
正如我们所知,停机问题是不可判定的,所以你想做的事情被证明是不可能的。