Vm2: Adakah alasan mengapa sebagian besar modul bawaan diproksi daripada diperlukan di kotak pasir?

Dibuat pada 17 Okt 2017  ·  5Komentar  ·  Sumber: patriksimek/vm2

Hai,
Saya mencoba mencari tahu mengapa modul bawaan diproksi dari Host dan tidak diperlukan di vm.

ini adalah pengaturan saya saat ini:

const vm = new NodeVM({
        require: {
            external: true,
            context: 'sandbox',
            builtin: ['*'],
        },
    });

vm.run(...);

di dalam VM saya memerlukan modul eksternal ( axios jika itu penting) dan dalam rantai dependensi itu memerlukan modul lain ( follow-redirects ) yang melakukan ini (kurang lebih):

var Writable = require('stream').Writable;

function RedirectableRequest(options, responseCallback) {
// .....
}

RedirectableRequest.prototype = Object.create(Writable.prototype);

RedirectableRequest.prototype._performRequest = function () {  // <-------- this line breaks
// ..........
}

menjalankan kode ini di dalam vm throws: TypeError: 'set' pada proxy: trap return falsish untuk properti '_performRequest'.
Objek aliran sedang diproksikan ke vm.

menjalankan kode ini ketika stream sebenarnya diperlukan di dalam vm (dengan menghapus pernyataan if di sini: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133) adalah bekerja.

menjalankan node 6.10.3 di osx.

Terima kasih

stale

Komentar yang paling membantu

Saya juga menemukan solusi alternatif (yang menurut saya lebih cocok dengan paradigma).

Pada dasarnya apa yang saya temukan adalah kode kontekstual mencoba menulis ke prototipe objek yang dibuatnya dalam konteksnya, tetapi memperluas objek yang dibawa dari konteks lain.

Per dokumentasi pada set proxy handler, jika properti tidak ada pada objek yang Anda coba setel, prototipe set handler akan dipanggil.

Jadi;
Obyek
prototipe
a <-Mengatur ini (yang sebenarnya tidak ada pada prototipe)
__proto__ (proksi)
set: (){} <- Sebenarnya memanggil ini

Dan ketika pengendali set dipanggil, argumen penerima akan disetel ke objek asli yang kita coba atur. Solusi saya adalah ini:

--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
 const OPNA = 'Operation not allowed on contextified object.';
 const ERROR_CST = Error.captureStackTrace;
 const FROZEN_TRAPS = {
-   set: (target, key) => false,
+   set: (target, key, value, receiver) => {
+       if( target !== receiver ){
+
+           Object.defineProperty(receiver, key, {
+               value: value,
+               writable: true,
+               enumerable: true,
+               configurable: true
+           })
+
+           return true;
+
+       }
+
+       return false;
+
+   },

Semua 5 komentar

terkait dengan #127

Saya melanjutkan dan mengubah pernyataan if menjadi:

if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){

Saya menemukan bahwa di node 8.x saya mengalami masalah dengan async_hooks

Saya juga menemukan solusi alternatif (yang menurut saya lebih cocok dengan paradigma).

Pada dasarnya apa yang saya temukan adalah kode kontekstual mencoba menulis ke prototipe objek yang dibuatnya dalam konteksnya, tetapi memperluas objek yang dibawa dari konteks lain.

Per dokumentasi pada set proxy handler, jika properti tidak ada pada objek yang Anda coba setel, prototipe set handler akan dipanggil.

Jadi;
Obyek
prototipe
a <-Mengatur ini (yang sebenarnya tidak ada pada prototipe)
__proto__ (proksi)
set: (){} <- Sebenarnya memanggil ini

Dan ketika pengendali set dipanggil, argumen penerima akan disetel ke objek asli yang kita coba atur. Solusi saya adalah ini:

--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
 const OPNA = 'Operation not allowed on contextified object.';
 const ERROR_CST = Error.captureStackTrace;
 const FROZEN_TRAPS = {
-   set: (target, key) => false,
+   set: (target, key, value, receiver) => {
+       if( target !== receiver ){
+
+           Object.defineProperty(receiver, key, {
+               value: value,
+               writable: true,
+               enumerable: true,
+               configurable: true
+           })
+
+           return true;
+
+       }
+
+       return false;
+
+   },

Apa statusnya? Proyek mati?

Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

XmiliaH picture XmiliaH  ·  19Komentar

wintertime-inc picture wintertime-inc  ·  5Komentar

unxcepted picture unxcepted  ·  11Komentar

CapacitorSet picture CapacitorSet  ·  13Komentar

patriksimek picture patriksimek  ·  5Komentar