javascript - 使用带有代码注入而不是线程的 NodeVM 时防止无限循环
问题描述
最近正在使用 Node.js 构建一个 API,该 API 接收不受信任的代码以使用 vm2 运行它。问题是我想运行异步函数,所以我需要使用NodeVM
不支持无限循环超时的方法,我发现所有关于使用子进程的解决方案,如果它不起作用则将其杀死。
但是我将代码作为字符串接收,并且我想防止其中出现无限循环,所以我想使用正则表达式来注入带有超时条件的 while/for 循环,或者在发生无限循环时抛出异常。
那可能吗?
解决方案
对我有用的完美解决方案是使用AST。所以我了解了更多关于它的信息,所以我可以在任何我想要的地方注入字符串。
然后我按照以下步骤操作:
Esprima
1- 使用解析器将字符串代码转换为 AST 。
2-注入无限循环代码保护,即:
// Before any loop
let myvar = Date.now();
// Inside the loop
if (Date.now() - myvar > 1000) { break;}
使用break
或抛出错误,请注意每次捕获循环时都需要一个唯一的变量名生成器。
3- 使用 . 将其转换回字符串escodegen
。
推荐阅读
- apostrophe-cms - 如何触发选择器模式?
- mongodb - 无法在 MacOS Mojave 10.14.2 上启动 Mongodb shell
- javascript - 导入引导 js 文件
- azure-data-explorer - 在 Azure 数据资源管理器中使用 Kusto 查询中的先前值填充空字段
- typescript - 在 React Native Expo 中预览上传的文件
- ssis - 将 Microsoft power bi 用于零售数据仓库的可视化是一种好习惯吗
- reactjs - 客户端 react-activity-feed @mentions 通知提要
- vba - VBA 到 Excel 中从选定的 DCM 文件中浏览和复制数据
- c++ - 在 C++ 中将 sqrt(var) 声明为编译时间常数
- python - 我最近开始使用 ROS,我目前正在我的 Ubuntu 20.04 上安装 Noetic,一切都很顺利,直到我编译 Turtlebot