例如,我有一些 JS 函数的字符串表示形式,该函数是从用户接收的,应该在服务器端执行。
有什么方法可以检查这段代码是否可以安全执行?我所说的安全是指:仅使用自定义上下文和基本类,不要尝试重新分配本机对象,不要尝试进行额外的网络调用或无限循环,等等。
以前我曾使用过vm2模块NodeJS来达到这样的目的。
如何检查不受信任的代码是否可以安全执行?
你不能以任何可靠的方式
但是您可以做的是在不同的上下文中运行该代码,使用没有命名空间的Web WorkersDeno。
// deno property defaults to false
const worker = new Worker(new URL("worker.js", import.meta.url).href, { type: "module", deno: false });
Run Code Online (Sandbox Code Playgroud)
您可以将字符串传递给工作人员并eval/Function在内部进行。或者将用户代码保存到文件并调用Worker该文件,您可以向用户代码添加包装器,以便将输出返回到主进程。
由于deno: false工作人员将无法访问Deno命名空间,因此用户将无法执行文件系统调用、启动服务器、读取环境变量等。
关于无限循环,在主进程中添加一个计时器,Worker如果那时还没有完成,则使用.terminate()
对于fetchWeb API,为了防止网络调用,您可以运行不带 --allow-net标志的 deno,或者可以将网络调用限制到特定域。--allow-net=deno.land
请记住,目前无法限制 Worker 可以分配的最大内存。限制将与 Deno 主进程相同。
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |