Vm2: TypeError: 'get' on proxy: property 'constants' adalah properti data hanya-baca dan tidak dapat dikonfigurasi pada target proxy tetapi proxy tidak mengembalikan nilai sebenarnya

Dibuat pada 7 Mar 2017  ·  15Komentar  ·  Sumber: patriksimek/vm2

Perhatikan ini ketika mencoba untuk meminta ketergantungan di vm. Beberapa kode untuk direproduksi:

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

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

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

Jejak tumpukan penuh:

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)

Beri tahu saya jika ada informasi lain yang dapat saya berikan untuk membantu Anda!

bug confirmed help wanted

Komentar yang paling membantu

Saya menemui kesalahan ini ketika saya mengekspor ES6 _class_ dalam skrip yang digunakan untuk menjalankan. tidak apa-apa setelah saya menerjemahkannya ke dalam
ES5.

Semua 15 komentar

Saya juga mengalami beberapa masalah seputar proxy, khususnya dengan warisan. Saya tidak yakin apakah masalah ini disebabkan oleh implementasi atau batasan Proxies, tetapi perlu diselidiki.

Juga mengalami kesalahan ini. Saya tidak cukup paham dengan proxy untuk memahami mengapa pola saat ini tidak baik, tetapi saya dapat menghilangkan kesalahan dengan menambahkan pemeriksaan ekstra untuk properti yang tidak dapat dikonfigurasi hanya-baca di 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];
                }

Ini sepertinya mengikuti get invarian yang dijelaskan MDN :

Nilai yang dilaporkan untuk properti harus sama dengan nilai properti objek target terkait jika properti objek target adalah properti data yang tidak dapat ditulis dan tidak dapat dikonfigurasi.

Tapi bagi saya sepertinya itu akan merusak sandboxing

Hanya menimpali untuk dicatat bahwa kami telah mengalami masalah ini secara lokal juga, dengan perubahan kode di atas memungkinkan kami untuk melewati masalah. Juga mencatat bahwa ini terjadi saat menggunakan modul node Google Sheets dalam salinan panduan memulai cepat mereka (https://developers.google.com/sheets/api/quickstart/nodejs).

Apakah ada pembaruan tentang masalah ini?

Apakah perbaikan ini berdampak pada masalah yang diketahui " Tidak mungkin untuk menentukan kelas yang memperluas kelas yang diproksikan ?" Apa maksud Anda itu akan merusak sandboxing?

Hei, ada kemajuan dalam masalah ini?
Saya mencoba menggunakan perpustakaan seperti graceful-fs dan mendapatkan kesalahan yang sama.

Saya menemui kesalahan ini ketika saya mengekspor ES6 _class_ dalam skrip yang digunakan untuk menjalankan. tidak apa-apa setelah saya menerjemahkannya ke dalam
ES5.

Sayangnya, solusi yang diposting oleh @mjbvz merusak kotak pasir. Saya tidak berpikir ada cara untuk memperbaiki masalah itu - itu Proxy untuk objek read-only tidak dapat mengembalikan apa pun kecuali nilai aslinya, maka kami mengacaukan dan melempar kesalahan adalah satu-satunya cara untuk menjaga keamanan kotak pasir .

Ide sangat disambut.

Bisakah kita mendapatkan klon dalam situasi ini?

Klon tidak membantu - klon juga merupakan nilai yang berbeda.

Yang saya maksud adalah tiruan dari fs.constants , jadi tidak lagi hanya-baca.

Itu akan memungkinkan kotak pasir untuk membuat perubahan pada objek yang dapat menyebabkan masalah dalam lingkup host. Anda harus sangat berhati-hati tentang apa yang Anda kirim ke kotak pasir karena setiap perubahan pada objek yang dibuat oleh kotak pasir juga efektif dalam konteks host.

Jika itu hanya-baca, apakah Anda bahkan memerlukan proxy untuk memverifikasi sesuatu?

Apakah ada pembaruan tentang masalah ini?
Saya mendapatkan masalah yang sama saat menggunakan modul node googleapi ...

@XmiliaH Terima kasih! sangat menghargai itu. Ini bekerja dengan versi terbaru.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

wojpawlik picture wojpawlik  ·  4Komentar

vshymanskyy picture vshymanskyy  ·  8Komentar

wintertime-inc picture wintertime-inc  ·  5Komentar

ghost picture ghost  ·  23Komentar

patriksimek picture patriksimek  ·  15Komentar