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!
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 ...
Diperbaiki dengan https://github.com/patriksimek/vm2/pull/252.
@XmiliaH Terima kasih! sangat menghargai itu. Ini bekerja dengan versi terbaru.
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.