Vm2: TypeError: 'get' на прокси: свойство 'constants' - это свойство данных только для чтения и не настраиваемое свойство данных на целевом прокси, но прокси не вернул его фактическое значение

Созданный на 7 мар. 2017  ·  15Комментарии  ·  Источник: patriksimek/vm2

Заметил это при попытке потребовать зависимость в vm. Некоторый код для воспроизведения:

const { NodeVM } = require("vm2");

const vm = new NodeVM({
  console: "redirect",
  sandbox: {},
  require: {
    builtin: ["fs"]
  },
  wrapper: "none"
});

vm.run("const fs = require('fs'); fs.constants");

Полная трассировка стека:

node_modules/vm2/lib/main.js:327
            throw this._internal.Decontextify.value(e);
            ^
TypeError: 'get' on proxy: property 'constants' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '[object Object]' but got '[object Object]')
    at Object.<anonymous> (vm.js:1:91)
    at NodeVM.run (node_modules/vm2/lib/main.js:325:27)
    at Object.<anonymous> (script.js:12:4)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)

Сообщите мне, есть ли еще какая-нибудь информация, которую я могу вам помочь!

bug confirmed help wanted

Самый полезный комментарий

Я столкнулся с этой ошибкой, когда экспортировал ES6 _class_ в скрипте, который использовался для запуска. это было нормально после того, как я перевел это на
ES5.

Все 15 Комментарий

У меня также довольно много проблем с прокси, особенно с наследованием. Я не уверен, связаны ли эти проблемы с реализацией или ограничениями прокси-серверов, но это стоит некоторого исследования.

Тоже столкнулся с этой ошибкой. Я недостаточно знаком с прокси, чтобы понять, почему текущий шаблон не подходит, но я смог устранить ошибку, добавив дополнительную проверку для свойств, не настраиваемых только для чтения, в Contextify.object.get :

    object: function(object, traps, deepTraps, flags, mock) {
        const proxy = new host.Proxy(object, host.Object.assign({
            get: (target, key, receiver) => {
                if (key === 'vmProxyTarget' && DEBUG) return object;
                if (key === 'isVMProxy') return true;
                if (mock && key in mock) return mock[key];
                if (key === 'constructor') return Object;
                if (key === '__proto__') return Object.prototype;

                                // Added code
                const config = host.Object.getOwnPropertyDescriptor(object, key);
                if (config && config.configurable === false && config.writable === false) {
                    return object[key];
                }

Похоже, это соответствует описанию get инварианта MDN :

Значение, сообщаемое для свойства, должно быть таким же, как значение соответствующего свойства целевого объекта, если свойство целевого объекта не является доступным для записи и не настраиваемым свойством данных.

Но мне кажется, что это сломает песочницу

Просто хочу отметить, что мы столкнулись с этой проблемой и локально, и приведенное выше изменение кода позволяет нам обойти проблему. Также отмечу, что это произошло при использовании модуля узла Google Sheets в почти точной копии их руководства по быстрому запуску (https://developers.google.com/sheets/api/quickstart/nodejs).

Есть ли обновления по этой проблеме?

Влияет ли это исправление на известную проблему « Невозможно определить класс, расширяющий прокси-класс ?» Что вы имеете в виду, это нарушит песочницу?

Эй, есть ли прогресс по этому вопросу?
Я пытался использовать библиотеки типа graceful-fs и получил ту же ошибку.

Я столкнулся с этой ошибкой, когда экспортировал ES6 _class_ в скрипте, который использовался для запуска. это было нормально после того, как я перевел это на
ES5.

К сожалению, решение, опубликованное @mjbvz, ломает песочницу. Я не думаю, что есть способ исправить эту проблему - если прокси для объекта только для чтения не может возвращать ничего, кроме исходного значения, тогда мы облажались, и выброс ошибки - единственный способ сохранить безопасность песочницы .

Идеи очень приветствуются.

Можем ли мы получить клон в этой ситуации?

Клонирование не помогает - клон также является отдельной ценностью.

Я имел в виду клон fs.constants , поэтому он больше не доступен только для чтения.

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

Если он доступен только для чтения, нужен ли вам прокси-сервер для проверки данных?

Есть ли обновления по этой проблеме?
У меня такая же проблема при использовании модуля узла googleapi ...

@XmiliaH Спасибо! действительно ценю это. Работает с последней версией.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги