2012-03-05 11 views
6

मैं चाहता हूं कि मेरा ऐप अविश्वसनीय उपयोगकर्ता से अभिव्यक्ति का मूल्यांकन करे, कि मैं एक JSON फ़ाइल से पढ़ रहा हूं। जैसे:सैंडबॉक्स में उपयोगकर्ता अभिव्यक्तियों का मूल्यांकन कैसे करें

value = "(getTime() == 60) AND isFoo('bar')" 

मुझे यहां स्टैक ओवरव्लो पर इसके बारे में कई धागे मिल गए हैं। आम तौर पर जावा की अपनी स्क्रिप्टइंजिन क्लास का उपयोग करने की सिफारिश करते हैं, जो जावास्क्रिप्ट को पढ़ सकते हैं। http://java-source.net/open-source/expression-languages

लेकिन वे सभी एक विश्वसनीय उपयोगकर्ता (पूर्व .: एक विन्यास फाइल आप अपने आप को लिखने पर भरोसा करने लगते हैं और: या उपयोगकर्ता की सिफारिश या तो इस तरह के JEXL, MVEL, या इस सूची में से किसी अन्य के रूप में एक मौजूदा पुस्तकालय का उपयोग करने के इसमें कुछ स्क्रिप्टिंग करना चाहते हैं)। लेकिन मेरे मामले में, मैं अपने अभिव्यक्ति मूल्यांकन को एक सुरक्षित सैंडबॉक्स में चलाने के लिए चाहता हूं। तो उपयोगकर्ता कुछ आसान नहीं कर सकता:

value = "while(true)" // or 
value = "new java.io.File(\"R:/t.txt\").delete()" // this works on MVEL 

और मेरे ऐप को लॉक करें, या अवांछित संसाधनों तक पहुंचें।

1) तो क्या उन मौजूदा पुस्तकालयों में से कोई भी आसानी से कॉन्फ़िगर किया जा सकता है ताकि यह एक सुरक्षित बॉक्स पर चल सके? 'आसानी से' से, मेरा मतलब उच्च स्तरीय कॉन्फ़िगरेशन एपीआई है जो मेरे अपने अभिव्यक्ति मूल्यांकनकर्ता को लिखने के लिए उपयोग करने के लिए तेज़ होगा। अपने स्वयं के शोध का थोड़ा सा करने के बाद, जेएक्सएल और एमवीईएल दोनों बाहर निकलते प्रतीत होते हैं।

2) या क्या कोई मौजूदा अभिव्यक्ति भाषा है जो बेहद सरल है ताकि इसका उपयोग अविश्वसनीय उपयोगकर्ता द्वारा नहीं किया जा सके? जो कुछ मैंने पाया वह बहुत ही जटिल है, और लूप, आयात कथन आदि जैसी चीजों को लागू करता है। मुझे गणित, तर्क ऑपरेटर और अपने स्वयं के परिभाषित चर और विधियों को पार्स करना है। इससे परे कुछ भी मेरे दायरे से बाहर है।

3) यदि एकमात्र समाधान मेरा स्वयं का अभिव्यक्ति मूल्यांकनकर्ता लिखना है, तो मुझे लगातार सुरक्षा मॉडल कैसे लिखना है, इस पर कुछ मार्गदर्शन कहां मिल सकता है? मैं इसके लिए नया हूं, और इस बारे में कोई जानकारी नहीं है कि कोड इंजेक्शन के लिए उपयोग की जाने वाली आम चाल क्या हैं। यही कारण है कि मैं इसे खुद लिखने से बचना चाहता था।

+1

वहाँ निम्नलिखित प्रश्न (जो अविश्वसनीय जावा कोड का थोड़ा कठिन स्थिति से संबंधित है) से कुछ उपयोगी जानकारी हो सकती है: http://stackoverflow.com/प्रश्न/9041246/क्या-सुरक्षा-जोखिम-i-चाहिए-guard-against-when-running-user-supplied-ja/9041423 # 9041423 – DNA

+0

क्या आपको कभी इस प्रश्न का उत्तर मिला? – ccleve

+0

कुछ भी नहीं जो मुझे संतुष्ट करेगा। मैंने बस इसे अपना खुद का निर्माण करने और इसे जाने के बारे में सीखने का फैसला किया। – VIBrunazo

उत्तर

1

मैं राइनो एम्बेड करने की सिफारिश कर सकता हूं, जिससे उपयोगकर्ता जावास्क्रिप्ट लिखने में सक्षम हो जाता है। यह आपके मानदंडों को फिट करता है (2) पूरी तरह से एक जावा लाइब्रेरी है जो आपको जावास्क्रिप्ट चलाने के लिए सक्षम बनाता है (या जावास्क्रिप्ट से जावा चलाता है)।

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

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

राइनो embedding को पूरा करने के लिए आप क्या http://www.mozilla.org/rhino/tutorial.html#runScript पर की जरूरत पर अधिक जानकारी

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