كيف يمكنك تشغيل Javascript باستخدام Rhino for Java في وضع الحماية؟

StackOverflow https://stackoverflow.com/questions/93911

سؤال

يحتاج جزء من تطبيق جافا لدينا إلى تشغيل جافا سكريبت الذي يكتبه غير المطورين.يستخدم هؤلاء غير المطورين جافا سكريبت لتنسيق البيانات.(منطق بسيط وتسلسل سلسلة في الغالب).

سؤالي هو كيف يمكنني إعداد تنفيذ هذه البرامج النصية للتأكد من أن أخطاء البرمجة النصية ليس لها تأثير سلبي كبير على بقية التطبيق.

  • بحاجة للحماية من الحلقات اللانهائية
  • الحذر من ظهور مواضيع جديدة.
  • الحد من الوصول إلى الخدمات والبيئة
    • نظام الملفات (مثال:إذا قرر كاتب السيناريو الساخط حذف الملفات)
    • قاعدة البيانات (نفس الشيء حذف سجلات قاعدة البيانات)

أحتاج في الأساس إلى إعداد نطاق جافا سكريبت ليشمل فقط ما يحتاجون إليه بالضبط وليس أكثر.

هل كانت مفيدة؟

المحلول

للحماية من الحلقات اللانهائية، ستحتاج إلى وضعها في عملية منفصلة حتى يمكن قتلها.

للحماية من إنشاء سلاسل رسائل، ستحتاج إلى توسيع SecurityManager (يسمح التنفيذ الافتراضي لتعليمات برمجية غير موثوقة بالوصول إلى مجموعات سلاسل المحادثات غير الجذرية).

يسمح لك أمان Java بمنع الوصول إلى نظام الملفات.

بالنسبة لقيود قاعدة البيانات، قد تتمكن من استخدام أمان مستخدم SQL القياسي، لكن هذا ضعيف جدًا.بخلاف ذلك، ستحتاج إلى توفير واجهة برمجة التطبيقات (API) التي تفرض قيودك.

يحرر:يجب أن أشير إلى أن إصدار Rhino المتوفر مع JDK6 قد تم إنجاز أعمال أمنية عليه، لكنه لا يتضمن المترجم.

نصائح أخرى

للحماية من الحلقات اللانهائية، يمكنك مراقبة عدد التعليمات أثناء تشغيل البرنامج النصي (يعمل هذا فقط مع البرامج النصية المفسرة، وليس مع البرامج النصية المجمعة).

هناك هذا مثال في Rhino JavaDocs لمنع تشغيل البرنامج النصي لأكثر من عشر ثوانٍ:

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }

لمنع الوصول إلى فئة Java وطريقة الوصول إليها، قم بإلقاء نظرة على...

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

لقد مررت للتو عبر منشور المدونة هذا الذي يبدو أنه مفيد في وضع الحماية لأي شيء تقريبًا (وليس وحيد القرن فقط):

http://calumleslie.blogspot.com/2008/06/simple-jvm-sandboxing.html

إذا كنت تبحث عن وظائف JavaScript خالصة فقط، فإليك حل يعتمد على مكتبة Rhino المضمنة في JDK دون استيراد أي مكتبات تابعة لجهات خارجية:

  1. تعرف على اسم فئة مصنع محرك البرنامج النصي JavaScript بواسطة ScriptEngineManager#getEngineFactories
  2. قم بتحميل فئة مصنع محرك البرنامج النصي في محمل فئة جديد، حيث سيتم تجاهل JavaMembers أو الفئات الأخرى ذات الصلة.
  3. اتصل بـ #getScriptEngine في مصنع محرك البرامج النصية الذي تم تحميله وقم بتقييم البرامج النصية على محرك البرامج النصية الذي تم إرجاعه.

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

يرجى قراءة ملفات ConfigJSParser.java وConfigJSClassLoader.java لمزيد من التفاصيل:

https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top