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!
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 ...
Behoben mit https://github.com/patriksimek/vm2/pull/252.
@XmiliaH Danke! Schätze es wirklich. Es funktioniert mit der neuesten Version.
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.