Vm2: TypeError: 'get' für Proxy: Eigenschaft 'constants' ist eine schreibgeschützte und nicht konfigurierbare Dateneigenschaft für das Proxy-Ziel, aber der Proxy hat seinen tatsächlichen Wert nicht zurückgegeben

Erstellt am 7. März 2017  ·  15Kommentare  ·  Quelle: patriksimek/vm2

Dies wurde beim Versuch bemerkt, eine Abhängigkeit in einer VM zu erfordern. Einige zu reproduzierende Codes:

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

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

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

Full-Stack-Trace:

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)

Lassen Sie mich wissen, ob ich Ihnen weitere Informationen geben kann, um Ihnen zu helfen!

bug confirmed help wanted

Hilfreichster Kommentar

Ich habe diesen Fehler festgestellt, als ich eine ES6-Klasse in das Skript exportiert habe, das zum Ausführen verwendet wurde. Es war in Ordnung, nachdem ich es übersetzt hatte
ES5.

Alle 15 Kommentare

Ich habe auch einige Probleme mit Proxys, insbesondere mit der Vererbung. Ich bin nicht sicher, ob diese Probleme auf die Implementierung oder eine Einschränkung von Proxies zurückzuführen sind, aber es lohnt sich, sie zu untersuchen.

Ist auch auf diesen Fehler gestoßen. Ich bin mit Proxys nicht vertraut genug, um zu verstehen, warum das aktuelle Muster nicht in Ordnung ist, aber ich konnte den Fehler beheben, indem ich in Contextify.object.get eine zusätzliche Prüfung für schreibgeschützte nicht konfigurierbare Eigenschaften hinzufügte:

    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];
                }

Dies scheint dem get invarianten MDN zu folgen, der

Der für eine Eigenschaft gemeldete Wert muss mit dem Wert der entsprechenden Zielobjekteigenschaft übereinstimmen, wenn die Zielobjekteigenschaft eine nicht beschreibbare, nicht konfigurierbare Dateneigenschaft ist.

Aber es scheint mir, als würde es den Sandkasten brechen

Ich mische mich nur ein, um festzustellen, dass wir auch lokal auf dieses Problem gestoßen sind. Mit der obigen Codeänderung können wir das Problem umgehen. Beachten Sie auch, dass dies während der Verwendung des Google Sheets-Knotenmoduls in einer fast exakten Kopie der Kurzanleitung (https://developers.google.com/sheets/api/quickstart/nodejs) geschehen ist.

Gibt es Updates zu diesem Thema?

Hat dieser Fix Auswirkungen auf das bekannte Problem " Es ist nicht möglich, eine Klasse zu definieren, die die Proxy-Klasse erweitert ?" Was meinst du damit, es würde den Sandkasten brechen?

Hey, gibt es Fortschritte in diesem Bereich?
Ich habe versucht, Bibliotheken wie graceful-fs und habe den gleichen Fehler erhalten.

Ich habe diesen Fehler festgestellt, als ich eine ES6-Klasse in das Skript exportiert habe, das zum Ausführen verwendet wurde. Es war in Ordnung, nachdem ich es übersetzt hatte
ES5.

Leider bricht die von @mjbvz gepostete Lösung die Sandbox. Ich glaube nicht, dass es eine Möglichkeit gibt, dieses Problem zu beheben. Wenn der Proxy für schreibgeschützte Objekte nur den ursprünglichen Wert zurückgeben kann, sind wir fertig und der Fehler ist die einzige Möglichkeit, die Sandbox sicher zu halten .

Ideen sind sehr willkommen.

Können wir in dieser Situation einen Klon bekommen?

Klon hilft nicht - ein Klon ist auch ein eindeutiger Wert.

Ich meinte einen Klon von fs.constants , daher ist er nicht mehr schreibgeschützt.

Dies würde es einer Sandbox ermöglichen, Änderungen am Objekt vorzunehmen, die Probleme im Bereich des Hosts verursachen könnten. Sie müssen sehr vorsichtig sein, was Sie an die Sandbox senden, da jede Änderung am Objekt, die von der Sandbox vorgenommen wird, auch im Kontext des Hosts wirksam ist.

Wenn es schreibgeschützt ist, benötigen Sie überhaupt einen Proxy, um Daten zu überprüfen?

Gibt es ein Update zu diesem Thema?
Ich habe das gleiche Problem bei der Verwendung des Googleapi-Knotenmoduls ...

@XmiliaH Danke! Schätze es wirklich. Es funktioniert mit der neuesten Version.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

patriksimek picture patriksimek  ·  15Kommentare

seanc picture seanc  ·  3Kommentare

wojpawlik picture wojpawlik  ·  4Kommentare

wintertime-inc picture wintertime-inc  ·  5Kommentare

vshymanskyy picture vshymanskyy  ·  8Kommentare