Как 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, запускать серверы, читать / записывать в файловую систему, завершать процесс, запускать дочерние процессы и т. Д. Это даже близко не является безопасным, Это гораздо более сложная проблема, для решения которой, вероятно, нужны полнофункциональные виртуальные машины с брандмауэром с собственной файловой системой, отдельными процессами и большим количеством процессов управления. Это совсем не простая задача.

Другие вопросы по тегам