Предотвращение бесконечного l oop при использовании NodeVM с внедрением кода, а не с потоками - PullRequest
0 голосов
/ 18 июня 2020

В последнее время я создаю API с Node.js, который получает ненадежный код для его запуска с использованием vm2. Проблема в том, что я хочу запускать функции asyn c, поэтому мне нужно использовать NodeVM, который не поддерживает тайм-аут для бесконечного l oop, решения, которые я нашел, все об использовании дочернего процесса, а затем убить его, если он не работает .

Но я получаю код в виде строки и хочу, чтобы в нем не было бесконечного l oop, поэтому я подумал об использовании регулярного выражения для ввода while / for l oop с таймаутом условие или что-то в этом роде, поэтому генерируйте исключение всякий раз, когда происходит бесконечное l oop.

Возможно ли это?

1 Ответ

0 голосов
/ 28 июня 2020

Идеальное решение, которое сработало для меня, - использовать AST . так что я узнал об этом больше, поэтому я могу вставить строку с чем угодно, где захочу.

Затем я выполнил следующие шаги:

1- преобразовать строковый код в AST с помощью Esprima парсера.

2- Внедрите защиту кода Infinite l oop, которая:

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

используйте break или выдайте ошибку, обратите внимание, что вам нужен генератор уникальных имен переменных каждый раз, когда вы catch al oop.

3- Преобразуйте его обратно в строку, используя escodegen.

...