Как проверить, безопасно ли выполнение ненадежного кода? - PullRequest
0 голосов
/ 16 июня 2020

Например, у меня есть строковое представление некоторой JS функции, полученной от пользователя и которая должна выполняться на стороне сервера.

Есть ли способ проверить, безопасен ли этот код выполнить? Под безопасностью я подразумеваю: использование только настраиваемого контекста и базовых классов c, не пытайтесь переназначить собственные объекты, не пытайтесь выполнять дополнительные сетевые вызовы или бесконечные циклы и т. Д.

Раньше я использовал модуль vm2 из NodeJS для этой цели.

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Вы можете использовать веб-воркеров без Deno пространства имен.

// deno property defaults to false
const worker = new Worker(new URL("worker.js", import.meta.url).href, { type: "module", deno: false });

Вы можете передать строку воркеру и eval/Function внутри. Или сохраните код пользователя в файл и вызовите Worker с этим файлом, вы можете добавить оболочку к коду пользователя, чтобы вы могли вернуть вывод в основной процесс.

С deno: false победил работник ' t имеют доступ к пространству имен Deno, поэтому пользователь не сможет выполнять вызовы файловой системы, запускать сервер, читать переменные среды и т. д. c.

А что касается бесконечных циклов, добавьте таймер в основной процесс и убейте Worker, если он не завершился к тому времени, используя .terminate()

Что касается fetch Web API, чтобы предотвратить сетевые вызовы, вы можете запустить команду без флага --allow-net, или вы можете ограничить сетевые вызовы определенным доменом c. --allow-net=deno.land

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

Это невозможно. То, что вы просите, эквивалентно решению проблемы остановки.

Фактически, эта часть ваших требований:

не пытайтесь создавать […] бесконечные циклы

не просто эквивалентно проблеме остановки, это буквально это проблема остановки.

Как мы знаем, проблема остановки неразрешима, поэтому что вы хотите сделать доказуемо невозможно.

...