Как правило, нужно запускать только собственные файлы JavaScript. Помимо теорий, в реальных сценариях требуется выполнять файлы JavaScript, которые передаются динамически во время выполнения. Например, рассмотрим динамический фреймворк, такой как веб-пакет, который принимает пользовательские загрузчики и выполняет их динамически во время сборки. При существовании какого-либо вредоносного плагина мы хотим минимизировать ущерб и, возможно, даже позволить потоку успешно завершиться - для этого необходимо запустить плагины в среде изолированной программной среды, которая полностью изолирована с точки зрения ресурсов, сбоев и информации, которой мы делимся с ней. Три основных варианта могут помочь в достижении этой изоляции:
- выделенный дочерний процесс - это обеспечивает быструю изоляцию информации, но требует приручить дочерний процесс, ограничить время его выполнения и устранить ошибки
- облачная безсерверная инфраструктура отвечает всем требованиям песочницы, но развертывание и динамический вызов функции FaaS - это не прогулка в парке
- некоторые библиотеки npm, такие как sandbox и vm2 позволяют выполнять изолированный код в 1 одна строка кода. Хотя этот последний вариант выигрывает в простоте, он обеспечивает ограниченную защиту
const Sandbox = require('sandbox');
const s = new Sandbox();
s.run('lol)hai', (output) => {
console.log(output);
//output='Syntax error'
});
// Example 4 - Restricted code
s.run('process.platform', (output) => {
console.log(output);
//output=Null
});
// Example 5 - Infinite loop
s.run('while (true) {}', (output) => {
console.log(output);
//output='Timeout'
});