首页 > 解决方案 > 使用带有代码注入而不是线程的 NodeVM 时防止无限循环

问题描述

最近正在使用 Node.js 构建一个 API,该 API 接收不受信任的代码以使用 vm2 运行它。问题是我想运行异步函数,所以我需要使用NodeVM不支持无限循环超时的方法,我发现所有关于使用子进程的解决方案,如果它不起作用则将其杀死。

但是我将代码作为字符串接收,并且我想防止其中出现无限循环,所以我想使用正则表达式来注入带有超时条件的 while/for 循环,或者在发生无限循环时抛出异常。

那可能吗?

标签: javascriptnode.jsregexvirtual-machinenode-vm2

解决方案


对我有用的完美解决方案是使用AST。所以我了解了更多关于它的信息,所以我可以在任何我想要的地方注入字符串。

然后我按照以下步骤操作:

Esprima1- 使用解析器将字符串代码转换为 AST 。

2-注入无限循环代码保护,即:

// Before any loop
let myvar = Date.now();
// Inside the loop
if (Date.now() - myvar > 1000) { break;}

使用break或抛出错误,请注意每次捕获循环时都需要一个唯一的变量名生成器。

3- 使用 . 将其转换回字符串escodegen


推荐阅读