Vm2: TypeError: 'get' no proxy: a propriedade 'constantes' é uma propriedade de dados somente leitura e não configurável no destino do proxy, mas o proxy não retornou seu valor real

Criado em 7 mar. 2017  ·  15Comentários  ·  Fonte: patriksimek/vm2

Percebi isso ao tentar exigir uma dependência em uma VM. Algum código para reproduzir:

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

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

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

Rastreamento de pilha completo:

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)

Avise-me se houver alguma outra informação que eu possa lhe dar para ser útil!

bug confirmed help wanted

Comentários muito úteis

Encontrei este erro quando exportei uma _class_ ES6 no script usado para executar. estava tudo bem depois que eu traduzi para
ES5.

Todos 15 comentários

Também estou tendo alguns problemas com proxies, especificamente com herança. Não tenho certeza se esses problemas são devido à implementação ou a uma limitação dos Proxies, mas vale a pena investigar.

Também encontrou este erro. Não estou familiarizado o suficiente com proxies para entender por que o padrão atual não está bom, mas consegui eliminar o erro adicionando uma verificação extra para propriedades não configuráveis ​​somente leitura em 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];
                }

Isso parece seguir o get invariante que o MDN descreve :

O valor relatado para uma propriedade deve ser igual ao valor da propriedade do objeto de destino correspondente se a propriedade do objeto de destino for uma propriedade de dados não gravável e não configurável.

Mas me parece que isso quebraria o sandboxing

Apenas entrando em contato para observar que também encontramos esse problema localmente, com a alteração do código acima nos permitindo contornar o problema. Observando também que isso aconteceu ao usar o módulo de nó do Planilhas Google em uma cópia quase exata do guia de início rápido (https://developers.google.com/sheets/api/quickstart/nodejs).

Há alguma atualização sobre esse problema?

Esta correção tem efeito sobre o problema conhecido " Não é possível definir uma classe que estende a classe com proxy ?" O que você quer dizer com isso quebraria o sandbox?

Ei, algum progresso neste assunto?
Tentei usar bibliotecas como graceful-fs e obtive o mesmo erro.

Encontrei este erro quando exportei uma _class_ ES6 no script usado para executar. estava tudo bem depois que eu traduzi para
ES5.

Infelizmente, a solução postada por @mjbvz quebra a sandbox. Não acho que haja uma maneira de corrigir esse problema - se o proxy para objeto somente leitura não puder retornar nada além do valor original, estamos ferrados e lançar o erro é a única maneira de manter a sandbox segura .

As ideias são muito bem-vindas.

Podemos obter um clone nesta situação?

Clone não ajuda - um clone também é um valor distinto.

Eu quis dizer um clone de fs.constants , então não é mais somente leitura.

Isso permitiria a uma sandbox fazer alterações no objeto que poderiam causar problemas dentro do escopo do host. Você precisa ter muito cuidado com o que enviar para a sandbox porque cada alteração no objeto feita pela sandbox também é eficaz no contexto do host.

Se for somente leitura, você precisa de um proxy para verificar as coisas?

Existe alguma atualização sobre este problema?
Estou tendo o mesmo problema ao usar o módulo de nó googleapi ...

@XmiliaH Obrigado! realmente aprecio isso. Ele está funcionando com a versão mais recente.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ozsay picture ozsay  ·  5Comentários

keyosk picture keyosk  ·  64Comentários

CapacitorSet picture CapacitorSet  ·  13Comentários

patriksimek picture patriksimek  ·  15Comentários

unxcepted picture unxcepted  ·  11Comentários