Как Pebble наблюдает за песочницей пользователя javascript/ выставляет API?
Мне интересно, как можно было бы заняться песочницей пользователя javascript и выставлять интерфейсы, не допуская изменения этих интерфейсов? В частности, в nodejs env. Пример:
//public class you can interface (should be immutable)
function InterfaceClass () {
this.x = 0;
thix.y = 0;
}
//executing users code (in a sandbox of some sort)
function userCode () {
//disallow this:
InterfaceClass = function () {
};
//allow this:
var interface = new Interface();
interface.x = 1;
}
1 ответ
Единственная часть песочницы, которую легко реализовать - это защита ваших интерфейсов и ваших собственных пользовательских функций Javascript.
Вы можете создать ситуацию, когда нет ваших собственных глобальных переменных, которые можно изменить, и единственными переменными, которые пользовательский код получает из внешнего мира, являются копии.
Для этого поместите пользовательский код в функцию вашего создания (аналогично тому, как загружается модуль узла), а затем передайте копии вашего API пользовательскому коду в качестве аргументов той главной функции, в которую вы упаковываете пользовательский код (вероятно, передавая его). это объект со свойствами на объекте). Затем все, что может сделать пользовательский код, - это изменить копии, а не изменять какие-либо оригиналы, чтобы это не повлияло на любой другой код.
Используя ваш пример:
// interfaces created inside some private scope
(function() {
//public class you can interface (should be immutable)
function InterfaceClass () {
this.x = 0;
thix.y = 0;
}
var api = {Interface: InterfaceClass};
launchUsercode(api);
})();
// user code is wrapped in your own function creating a private scope
function launchUsercode(api) {
//executing users code (in a sandbox of some sort)
function userCode () {
//allow this:
var interface = new api.Interface();
interface.x = 1;
// mucking with api.Interface does not do anything other than
// mess up their own environment
}
userCode();
};
К вашему сведению, единственное, что это защищает, - это переопределение ваших собственных функций. Этот пользовательский код может делать все, что может делать любое приложение node.js, запускать серверы, читать / записывать в файловую систему, завершать процесс, запускать дочерние процессы и т. Д. Это даже близко не является безопасным, Это гораздо более сложная проблема, для решения которой, вероятно, нужны полнофункциональные виртуальные машины с брандмауэром с собственной файловой системой, отдельными процессами и большим количеством процессов управления. Это совсем не простая задача.