Vm2: TypeError: 'get' on proxy: الخاصية 'الثوابت' هي خاصية بيانات للقراءة فقط وغير قابلة للتكوين على هدف الوكيل ولكن الوكيل لم يُرجع قيمته الفعلية

تم إنشاؤها على ٧ مارس ٢٠١٧  ·  15تعليقات  ·  مصدر: patriksimek/vm2

لاحظت هذا أثناء محاولة طلب التبعية في 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)

اسمحوا لي أن أعرف إذا كان هناك أي معلومات أخرى يمكنني أن أقدمها لك لتكون مفيدة!

bug confirmed help wanted

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

لقد واجهت هذا الخطأ عندما قمت بتصدير فئة _ ES6 في البرنامج النصي المستخدم للتشغيل. كان الأمر جيدًا بعد أن قمت بترجمته إلى
ES5.

ال 15 كومينتر

لدي أيضًا بعض المشكلات حول الوكلاء ، خاصةً مع الميراث. لست متأكدًا مما إذا كانت هذه المشكلات ناتجة عن تطبيق Proxies أو تقييده ، لكن الأمر يستحق بعض التحقيق.

كما واجهت هذا الخطأ. لست على دراية كافية بالخوادم الوكيلة لفهم سبب عدم صحة النمط الحالي ، لكنني تمكنت من إزالة الخطأ عن طريق إضافة فحص إضافي للخصائص غير القابلة للتكوين للقراءة فقط في 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];
                }

يبدو أن هذا يتبع get MDN الثابت get يصفه :

يجب أن تكون القيمة المبلغ عنها للخاصية هي نفسها قيمة خاصية الكائن الهدف المقابلة إذا كانت خاصية الكائن الهدف خاصية بيانات غير قابلة للكتابة وغير قابلة للتكوين.

ولكن يبدو لي أنه قد يكسر وضع الحماية

ما عليك سوى المشاركة في ملاحظة أننا واجهنا هذه المشكلة محليًا أيضًا ، مع تغيير الرمز أعلاه مما يسمح لنا بتجاوز المشكلة. لاحظ أيضًا أن هذا حدث أثناء استخدام وحدة عقدة جداول بيانات Google في نسخة مطابقة تقريبًا من دليل البدء السريع (https://developers.google.com/sheets/api/quickstart/nodejs).

هل هناك أي تحديثات بخصوص هذه القضية؟

هل يؤثر هذا الإصلاح على المشكلة المعروفة " ليس من الممكن تعريف الفئة التي تقوم بتوسيع فئة الوكيل ؟" ماذا تقصد سوف يكسر الصندوق الرمل؟

مهلا ، أي تقدم في هذه القضية؟
حاولت استخدام مكتبات مثل graceful-fs وحصلت على نفس الخطأ.

لقد واجهت هذا الخطأ عندما قمت بتصدير فئة _ ES6 في البرنامج النصي المستخدم للتشغيل. كان الأمر جيدًا بعد أن قمت بترجمته إلى
ES5.

لسوء الحظ ، الحل الذي نشره mjbvz يكسر الحماية. لا أعتقد أن هناك طريقة لإصلاح هذه المشكلة - فالوكيل الخاص بكائن للقراءة فقط لا يمكنه إرجاع أي شيء آخر باستثناء القيمة الأصلية ، ثم نحن مشدودون وإلقاء الخطأ هو الطريقة الوحيدة للحفاظ على أمان sandbox .

الأفكار موضع ترحيب كبير.

هل يمكننا الحصول على نسخة في هذه الحالة؟

لا يساعد الاستنساخ - فالنسخة هي أيضًا قيمة مميزة.

قصدت نسخة من fs.constants ، لذا فهي لم تعد للقراءة فقط.

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

إذا كان للقراءة فقط ، فهل تحتاج حتى إلى وكيل للتحقق من الأشياء؟

هل هناك أي تحديث حول هذه المشكلة؟
أواجه نفس المشكلة عند استخدام وحدة عقدة googleapi ...

XmiliaH شكرا لك! نقدر ذلك حقا. إنه يعمل بأحدث إصدار.

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