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)
他に役立つ情報があれば教えてください。
また、プロキシ、特に継承に関して、かなりの数の問題が発生しています。 これらの問題がプロキシの実装によるものなのか制限によるものなのかはわかりませんが、調査する価値があります。
また、このエラーが発生しました。 現在のパターンが正しくない理由を理解するのに十分なプロキシに精通していませんが、 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];
}
ターゲットオブジェクトプロパティが書き込み不可、構成不可のデータプロパティである場合、プロパティについて報告される値は、対応するターゲットオブジェクトプロパティの値と同じである必要があります。
しかし、それはサンドボックスを壊すように私には思えます
ローカルでもこの問題が発生していることに注意してください。上記のコード変更により、問題を回避できます。 また、クイックスタートガイド(https://developers.google.com/sheets/api/quickstart/nodejs)のほぼ正確なコピーでGoogleSheetsノードモジュールを使用しているときにこれが発生したことにも注意してください。
この問題に関する更新はありますか?
この修正は、既知の問題「プロキシされたクラスを拡張するクラスを定義することはできませんか?」に影響しますか? サンドボックスを壊すとはどういう意味ですか?
ねえ、この問題の進展はありますか?
graceful-fs
ようなライブラリを使おうとすると、同じエラーが発生します。
実行に使用したスクリプトでES6_class_をエクスポートしたときに、このエラーが発生しました。 私がそれを翻訳した後、それは大丈夫でした
ES5。
残念ながら、 @ mjbvzによって投稿されたソリューションはサンドボックスを壊します。 その問題を修正する方法はないと思います-読み取り専用オブジェクトのプロキシが元の値以外のものを返すことができない場合、私たちは失敗し、エラーをスローすることがサンドボックスを安全に保つ唯一の方法です。
アイデアは大歓迎です。
この状況でクローンを取得できますか?
クローンは役に立ちません-クローンもまた明確な価値です。
fs.constants
クローンを意味したので、読み取り専用ではなくなりました。
これにより、サンドボックスがオブジェクトに変更を加えることができ、ホストのスコープ内で問題が発生する可能性があります。 サンドボックスによって行われたオブジェクトへのすべての変更はホストのコンテキストでも有効であるため、サンドボックスに送信する内容には十分注意する必要があります。
読み取り専用の場合、検証のためにプロキシも必要ですか?
この問題に関する更新はありますか?
googleapiノードモジュールを使用すると同じ問題が発生します...
@XmiliaHありがとうございます! 心から感謝する。 最新バージョンで動作しています。
最も参考になるコメント
実行に使用したスクリプトでES6_class_をエクスポートしたときに、このエラーが発生しました。 私がそれを翻訳した後、それは大丈夫でした
ES5。