Files
nodebestpractices/sections/security/sandbox.russian.md
2019-11-29 08:50:06 +03:00

34 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Запускайте небезопасный код в песочнице
### Объяснение в один абзац
Как правило, нужно запускать только собственные файлы JavaScript. Помимо теорий, в реальных сценариях требуется выполнять файлы JavaScript, которые передаются динамически во время выполнения. Например, рассмотрим динамический фреймворк, такой как веб-пакет, который принимает пользовательские загрузчики и выполняет их динамически во время сборки. При существовании какого-либо вредоносного плагина мы хотим минимизировать ущерб и, возможно, даже позволить потоку успешно завершиться - для этого необходимо запустить плагины в среде изолированной программной среды, которая полностью изолирована с точки зрения ресурсов, сбоев и информации, которой мы делимся с ней. Три основных варианта могут помочь в достижении этой изоляции:
- выделенный дочерний процесс - это обеспечивает быструю изоляцию информации, но требует приручить дочерний процесс, ограничить время его выполнения и устранить ошибки
- облачная безсерверная инфраструктура отвечает всем требованиям песочницы, но развертывание и динамический вызов функции FaaS - это не прогулка в парке
- некоторые библиотеки npm, такие как [sandbox](https://www.npmjs.com/package/sandbox) и [vm2](https://www.npmjs.com/package/vm2) позволяют выполнять изолированный код в 1 одна строка кода. Хотя этот последний вариант выигрывает в простоте, он обеспечивает ограниченную защиту
### Пример кода - Использование библиотеки Sandbox для изолированного выполнения кода
```javascript
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'
});
```