الفرع: https://github.com/patriksimek/vm2/tree/feature-browsers
المكتبة: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js
إستعمال
<script src="vm2.js"></script>
<script>
const vm = new vm2.VM();
alert(vm.run('Math.random()'));
</script>
مشاكل
window.top
.لكى يفعل
NodeVM
من إصدار المتصفح.BrowserVM
إلى إصدار المتصفح مع الميزات المتعلقة بالمتصفح.يمكن أن يتضمن الحل المبتكر إلى حد ما إعادة كتابة AST للالتفاف يدويًا لكل وصول إلى الممتلكات. على سبيل المثال ، ستتم إعادة كتابة let x = foo.bar
إلى let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar)
.
فيما يلي مثال على إعادة كتابة AST ، حيث يتم لف عقد استدعاء الوظائف في عقد مثل هذه .
عيوب هذا الأسلوب هي أنه لا يمكنك بسهولة تصحيح أخطاء الكود المعاد كتابته ، وأن الأمر يتطلب بعض الحلول للتعامل مع الوظيفة ، و Eval وما شابه ذلك.
أعتقد أن الطريقة الوحيدة هي الوزن الثقيل جدًا وهو تفسير JS بنفسك ، أو استبدال إنشاءات الوظائف بتطبيق مخصص (مثل حقن محتوى متغير وتحليل). سيكون من الصعب جدًا تنفيذ هذه الطريقة.
حذف المتغير مستحيل بسبب متغيرات مثل document
و top
لا يمكن حذفها أو الكتابة فوقها
@ io4 ، استبدال الوظيفة و Eval وما شابه ذلك في وقت التشغيل ممكن بالتأكيد مع إعادة كتابة AST وهو ليس صعبًا للغاية أيضًا. ومع ذلك ، فإنه يتكبد نجاحًا كبيرًا في الأداء ، سواء في "وقت الترجمة" حيث يتعين عليك إعادة كتابة كل استدعاء دالة حرفيًا وفي وقت التشغيل نظرًا لأن استدعاءات الوظائف يجب أن تمر عبر طبقة واحدة من المراوغة.
تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.
من فضلك لا تغلق ، هذه قضية ذات صلة.
أفكر في استخدام العاملين على الويب لجعل vm2 يعمل في المتصفحات. أنا سوف إعطائها بالرصاص.
ربما يمكنك وضعها داخل إطار iframe أيضًا. بهذه الطريقة ، إذا هرب ، فإنه لا يزال مقيدًا بالإطار ولا يمكنه التنقل في سياق تصفح المستوى الأعلى.
الحالة هي أننا لا نستطيع استخدام العاملين على الويب لأنهم لا يشاركون الذاكرة مع المضيف. كنت أقوم باختبار إطار iframe المغطى بالرمل ، ولكن لم ينجح أيضًا هناك. بدون الخيار allow-same-origin
، لا يبدأ vm2 حتى. مع تمكين هذا الخيار ، يمكنني الوصول إلى نافذة المستوى الأعلى. لكنني لن أستسلم :)
ما نوع الخطأ الذي أعطتك إياه؟ هل تحتاج إلى الوصول إلى متغير؟ هل كانت تفتقد مكتبة؟ أي بيانات يمكن استرجاعها من خلال تبادل الرسائل بين إطارات iframe؟
لقد حاولت إصلاح الوصول إلى النافذة بنفس الحيلة مثل realms-shim.
يمكن العثور على تطبيق هنا: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
العيب هو أن كل شيء في vm يعمل في وضع صارم.
patriksimek للتغلب على مشكلة window.top
، ألا يمكنك ملاحظة الكائن وقتل النص (خطأ وخطأ) إذا تم تعديله / استخدامه؟ لذلك ، لاحظ الخصائص ووظائف الالتفاف
الفرع: https://github.com/patriksimek/vm2/tree/feature-browsers
المكتبة: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.jsإستعمال
<script src="vm2.js"></script> <script> const vm = new vm2.VM(); alert(vm.run('Math.random()')); </script>
مشاكل
- يمكن الهروب من Sandbox عبر
window.top
.لكى يفعل
- إزالة
NodeVM
من إصدار المتصفح.- أضف
BrowserVM
إلى إصدار المتصفح مع الميزات المتعلقة بالمتصفح.- اختبارات المتصفح الآلية.
لا أعرف طريقة لمراقبة window
أو window.top
بطريقة تسمح بالتخلص قبل حدوث شيء ما.
أهلا
أحتاج إلى استيراد vm2.js كوحدة نمطية إلى ملف نصي.
هل يمكن لأحد المساعدة رجاءا شكرا لك
أهلا
أحتاج إلى استيراد vm2.js كوحدة نمطية إلى ملف نصي.
هل يمكن لأحد المساعدة رجاءا شكرا لك
العمل كوحدة نمطية: تمت إضافة module.exports = vm2;
في نهاية الملف.
التعليق الأكثر فائدة
أفكر في استخدام العاملين على الويب لجعل vm2 يعمل في المتصفحات. أنا سوف إعطائها بالرصاص.