2010-01-27 7 views
7

हम एक जावा अनुप्रयोग है और अविश्वसनीय कोड जावास्क्रिप्ट दुभाषिया में बनाया का उपयोग कर चलाने के लिए चाहते हैं (javax.script। *)कैसे को लॉक करने के लिए (या सैंडबॉक्स) JDK के अंतर्निहित जावास्क्रिप्ट दुभाषिया चलाने के लिए अविश्वसनीय लिपियों

हालांकि डिफ़ॉल्ट रूप से दुभाषिया किसी भी जावा वर्ग तक पहुंच की अनुमति देता है। उदाहरण के लिए स्क्रिप्ट में "java.lang.System.exit(0)" जेवीएम बंद कर देगा। मेरा मानना ​​है कि इसे "लाइव कनेक्ट" कहा जाता है, अधिक जानकारी के लिए सूर्य की "जावा स्क्रिप्टिंग प्रोग्रामर गाइड" देखें।

मैं किसी भी तरह बंद, जावा वर्गों का उपयोग करने की स्क्रिप्ट के लिए क्षमता बारी चाहते हैं अर्थात मैं केवल स्क्रिप्ट वस्तुओं है कि मैं विशेष रूप से ScriptEngine पर eval() या put() तरीकों का उपयोग कर में इंजेक्षन उपयोग करने में सक्षम होना चाहता हूँ।

मैं, कैसे दुभाषिया (राइनो) के पुराने स्टैंडअलोन संस्करण के साथ इस लक्ष्य को हासिल करने पर कुछ प्रलेखन पाया है उदाहरण के लिए देखें http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

हालांकि इस दृष्टिकोण नहीं संभव JDK 1.6 में सूरज आंतरिक कक्षाओं का उपयोग किए बिना, के रूप में क्लासशटर ​​आदि आंतरिक रूप से सभी सेटअप है और सार्वजनिक तरीकों से ओवरराइड नहीं किया जा सकता है।

मुझे आशा है कि इसके आसपास एक आसान तरीका है जिसके लिए एक कस्टम सुरक्षा प्रबंधक, क्लासलोडर इत्यादि का उपयोग करके जटिल हुप्स के माध्यम से कूदने की आवश्यकता नहीं है लेकिन कुछ भी नहीं मिला है।

आप विभिन्न अनुप्रयोगों में जावास्क्रिप्ट के आस-पास सुरक्षा बुलेटिन की आवृत्ति के साथ अपेक्षा करेंगे, लाइव कनेक्ट को अक्षम करने के लिए एक साधारण ध्वज होगा!

+0

भी देखें: http://stackoverflow.com/questions/1347099/how-do-i-secure-scripts -रुन-यूजिंग-जैवैक्स-स्क्रिप्टिंग – McDowell

+0

मैं अभी भी 2014 में विश्वास नहीं कर सकता हूं जावा के स्क्रिप्टइंजिन के लिए लाइव कनेक्ट को अक्षम करने का कोई आसान तरीका नहीं है। मैंने किसी भी भाग्य के बिना पहुंच प्रतिबंधित करने के लिए एक आसान तरीका खोजने के लिए खोज और खोज की है।मैं एक सर्वर साइड एप्लिकेशन को तैनात कर रहा हूं जो जेएसआर 223 का उपयोग कर जावास्क्रिप्ट प्रदान किए गए जावास्क्रिप्ट को पार्स करने में सक्षम होना चाहिए और "java.awt.Desktop.getDesktop()' "या" java.lang.System.exit "जैसी चीजों को अक्षम करने में सक्षम होना चाहिए। (0) '" यह लागू करने के लिए असंभव के बगल में है। – chrixm

उत्तर

1

मैंने बहुत कुछ खोजा, codeutopia.net के ब्लॉग सैंडबॉक्सिंग तरीके और अन्य सुरक्षा प्रबंधक समाधानों को आजमाया, असंतुष्ट महसूस किया। और फिर मेरे क्लास लोडर समाधान से बाहर आया, जेडीके एम्बेडेड राइनो लाइब्रेरी पर आधारित किसी तीसरे पक्ष के पुस्तकालयों को आयात किए बिना। कोड के लगभग 200 लाइनों के साथ दो जावा वर्ग, वर्तमान में यह मेरा सबसे सरल समाधान है जो मेरी जावास्क्रिप्ट केवल आवश्यकता को फिट करता है।

  1. बाहर जावास्क्रिप्ट स्क्रिप्ट इंजन कारखाना वर्ग के नाम ScriptEngineManager # getEngineFactories द्वारा एक नया वर्ग लोडर, जिसमें JavaMembers या अन्य संबंधित वर्गों नजरअंदाज कर दिया जाएगा में
  2. लोड स्क्रिप्ट इंजन कारखाना वर्ग का पता लगाएं।
  3. लोड स्क्रिप्ट इंजन फैक्ट्री पर #getScriptEngine कॉल करें और लौटाए गए स्क्रिप्ट इंजन पर eval स्क्रिप्ट्स।

यदि दिए गए स्क्रिप्ट में जावा स्क्रिप्ट शामिल है, तो क्लास लोडर जावामेम्बर या अन्य कक्षाओं को लोड करने का प्रयास करेगा और कक्षा को ट्रिगर करने के लिए अपवाद नहीं मिलेगा। इस तरह, दुर्भावनापूर्ण स्क्रिप्ट निष्पादन के बिना अनदेखा कर दी जाएगी।

कृपया अधिक जानकारी के लिए ConfigJSParser.java और ConfigJSClassLoader.java फ़ाइलों को पढ़ने:

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

संबंधित मुद्दे

 संबंधित मुद्दे