Vm2: هل هناك أي سبب لكون معظم الوحدات المدمجة عبارة عن وكيل بدلاً من أن تكون مطلوبة في وضع الحماية؟

تم إنشاؤها على ١٧ أكتوبر ٢٠١٧  ·  5تعليقات  ·  مصدر: patriksimek/vm2

أهلا،
أحاول معرفة سبب إنشاء الوحدات النمطية المدمجة من المضيف وعدم الحاجة إليها في الجهاز الافتراضي.

هذا هو الإعداد الخاص بي حاليًا:

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

vm.run(...);

داخل VM ، أطلب وحدة خارجية ( axios إذا كان ذلك مهمًا) وفي سلسلة التبعيات ، تتطلب وحدة أخرى ( follow-redirects ) تقوم بهذا (أكثر أو أقل):

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

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

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

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

تشغيل هذا الكود داخل رميات vm: TypeError: 'set' on proxy: trap عاد falsish للخاصية '_performRequest'.
يتم الآن توكيل كائن الدفق إلى الجهاز الظاهري.

تشغيل هذا الكود عندما يكون stream مطلوبًا بالفعل داخل vm (عن طريق إزالة عبارة if هنا: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133) هو عمل.

تشغيل العقدة 6.10.3 على OSX.

شكرا

stale

التعليق الأكثر فائدة

لقد وجدت أيضًا حلاً بديلاً (أعتقد أنه يناسب النموذج بشكل أفضل).

ما وجدته بشكل أساسي هو أن التعليمات البرمجية السياقية كانت تحاول الكتابة إلى نموذج أولي لكائن أنشأته في سياقه ، لكنها وسعت كائنًا تم إحضاره من سياق آخر.

وفقًا للوثائق الموجودة على معالج الوكيل المحدد ، إذا لم تكن الخاصية موجودة على الكائن الذي تحاول تعيينه ، فسيتم استدعاء معالج مجموعة النموذج الأولي.

وبالتالي؛
موضوع
النموذج المبدئي
أ <-إعداد هذا (وهو غير موجود بالفعل في النموذج الأولي)
__proto__ (الوكيل)
مجموعة: () {} <- هذا في الواقع

وعندما يتم استدعاء معالج المجموعة ، سيتم تعيين وسيطة المتلقي على الكائن الأصلي الذي كنا نحاول تعيينه. كان الحل هو هذا:

--- 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;
+
+   },

ال 5 كومينتر

المتعلقة بـ # 127

تقدمت وقمت بتغيير عبارة if إلى:

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

لقد وجدت أنه في العقدة 8.x واجهت مشكلات مع الخطافات غير المتزامنة

لقد وجدت أيضًا حلاً بديلاً (أعتقد أنه يناسب النموذج بشكل أفضل).

ما وجدته بشكل أساسي هو أن التعليمات البرمجية السياقية كانت تحاول الكتابة إلى نموذج أولي لكائن أنشأته في سياقه ، لكنها وسعت كائنًا تم إحضاره من سياق آخر.

وفقًا للوثائق الموجودة على معالج الوكيل المحدد ، إذا لم تكن الخاصية موجودة على الكائن الذي تحاول تعيينه ، فسيتم استدعاء معالج مجموعة النموذج الأولي.

وبالتالي؛
موضوع
النموذج المبدئي
أ <-إعداد هذا (وهو غير موجود بالفعل في النموذج الأولي)
__proto__ (الوكيل)
مجموعة: () {} <- هذا في الواقع

وعندما يتم استدعاء معالج المجموعة ، سيتم تعيين وسيطة المتلقي على الكائن الأصلي الذي كنا نحاول تعيينه. كان الحل هو هذا:

--- 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;
+
+   },

ما هو الوضع؟ مشروع ميت؟

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات