2010-10-14 10 views
7

मैं एक wxpython ऐप बना रहा हूं कि मैं कई प्लेटफ़ॉर्म के लिए निष्पादन योग्य बनाने के लिए वहां विभिन्न फ्रीजिंग उपयोगिता के साथ संकलित करूंगा।पायथन - एक "स्क्रिप्टिंग" सिस्टम बनाना

कार्यक्रम एक टाइल आधारित खेल इंजन

इस एप्लिकेशन को मैं इतना है कि उन्नत उपयोगकर्ताओं के इस तरह के प्रोजेक्ट डेटा को संशोधित करने के रूप में कार्यक्रम के व्यवहार को संशोधित कर सकते हैं एक पटकथा प्रणाली प्रदान करना चाहते हैं के लिए एक नक्शा editer देगा, लेकिन निर्यात एक अलग प्रारूप ect के लिए परियोजना।

मैं चाहता हूं कि सिस्टम इस तरह काम करे।

उपयोगकर्ता एक स्टाइल टेक्स्टबॉक्स में चलाने के लिए इच्छित पायथन स्क्रिप्ट रखेगा और फिर स्क्रिप्ट निष्पादित करने के लिए एक बटन दबाएगा।

मैं अब तक इस सब के साथ अच्छा हूं कि सभी वास्तव में सरल चीजें हैं। के रूप में एक स्ट्रिंग इनबिल्ट समारोह संकलन (के साथ एक कॉड वस्तु के लिए यह संकलन पाठ बॉक्स के स्क्रिप्ट प्राप्त) तो एक कार्यकारी बयान के साथ स्क्रिप्ट को निष्पादित

script = textbox.text #bla bla store the string 
code = compile(script, "script", "exec") #make the code object 
eval(code, globals()) 

बात है, मुझे लगता है कि यह सुनिश्चित करना चाहते यह सुविधा किसी भी त्रुटि या बग का कारण नहीं बन सकती है
कहें कि स्क्रिप्ट में कोई आयात कथन है या नहीं। क्या इससे कोई समस्या हो सकती है कि कोड को py2exe या py2app जैसे संकलित किया गया है?
मैं यह कैसे सुनिश्चित कर सकता हूं कि उपयोगकर्ता प्रोग्राम के महत्वपूर्ण भाग को तोड़ नहीं सकता है जैसे कि जीयूआई के हिस्से को संशोधित करते हुए, जबकि उन्हें परियोजना डेटा को संशोधित करने की अनुमति मिलती है (डेटा अपने मॉड्यूल में वैश्विक गुणों में होता है)? मुझे लगता है कि इसका मतलब ग्लोबल्स के निर्देश को संशोधित करना होगा जो eval function को पास किया जाता है।
मैं यह कैसे सुनिश्चित कर सकता हूं कि यह eval लंबे या अनंत लूप के कारण प्रोग्राम को लटका नहीं दे सकता है? मैं कैसे सुनिश्चित कर सकता हूं कि उपयोगकर्ता के कोड के अंदर उठाई गई त्रुटि पूरे ऐप को क्रैश नहीं कर सकती है?

मूल रूप से, मैं उन सभी समस्याओं से कैसे बच सकता हूं जो उपयोगकर्ता को अपना कोड चलाने की अनुमति देते समय उत्पन्न हो सकते हैं?

संपादित करें: के संबंध में जवाब

मैं जवाब में से कोई भी अब तक वास्तव में मेरे सवालों का जवाब दे दिया है हाँ वे किया गया है भाग में दिए लेकिन पूरी तरह से नहीं की तरह नहीं लग रहा है को देखते हुए। मुझे अच्छी तरह से पता है कि असुरक्षित कोड को पूरी तरह से रोकना असंभव है। एक सुरक्षा प्रणाली के आसपास आने और उन्हें रोकने के सभी तरीकों के बारे में सोचने के लिए लोग एक आदमी (या यहां तक ​​कि एक टीम) के लिए बहुत चालाक हैं।

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

अब दायरे के बारे में हिस्सा का उत्तर दिया गया है। अब मैं समझता हूं कि eval फ़ंक्शन से कौन से फ़ंक्शंस और ग्लोबल्स का उपयोग किया जा सकता है, लेकिन यह सुनिश्चित करने का कोई तरीका है कि यदि उनके कोड को निष्पादित किया जा सकता है तो इसे रोक दिया जा सकता है?
शायद एक हरा धागा प्रणाली शायद?(हरा, क्योंकि यह उन धागा सुरक्षा के बारे में चिंता करने के लिए eval होगा)

भी अगर एक उन है कि वर्ग के बाकी हिस्सों में नहीं किया जाता है और भी डिफ़ॉल्ट पुस्तकालय से एक मॉड्यूल लोड करने के लिए एक import module बयान उपयोग करता है। क्या यह ऐप के साथ Py2exe, Py2app, या फ्रीज द्वारा जमे हुए समस्याओं के कारण हो सकता है? क्या होगा यदि वे मानक पुस्तकालय के एक मोडल आउट पक्ष कहते हैं? क्या यह पर्याप्त होगा कि मोडल एक ही निर्देशिका में जमे हुए निष्पादन योग्य के रूप में मौजूद है?

मैं इन उत्तरों को एक नया प्रश्न बनाने के साथ प्राप्त करना चाहता हूं लेकिन मुझे यह करना होगा।

+0

ईवल पूरी तरह से सुरक्षित आईएमओ बनाने के लिए व्यावहारिक रूप से असंभव है (लेकिन यह विशेषज्ञता का मेरा मुख्य क्षेत्र नहीं है, मैं अपने गधे से बात कर रहा हूं)। इसके लिए प्लग-इन संरचना के साथ एक एपीआई विकसित करने का तरीका क्यों नहीं है, अगर सुरक्षा/एकीकरण और कार्यक्षमता का दायरा चिंता का विषय है? –

+0

अरे, कम से कम यह 'exec' नहीं है। – nmichaels

+0

कम से कम, यह मान लें कि यह उन वास्तव में, वास्तव में दुर्लभ उदाहरणों में से एक है जहां एक को पकड़ना-'सब-सब' को छोड़कर: 'समझ में आता है और इसे लागू करता है। पूरे ऐप को क्रैश करने की कोई आवश्यकता नहीं है क्योंकि एक उपयोगकर्ता अपेक्षाकृत नया पाइथन अंतरिक्ष से चूक गया है। +1 और पसंदीदा, मैं भी एक ऐप में एक पायथन आरईपीएल को शामिल करने की उम्मीद कर रहा हूं। – delnan

उत्तर

5

आसान उत्तर: नहीं।

आप कुछ कीवर्ड (import) और संचालन को रोक सकते हैं, और कुछ डेटा संरचनाओं तक पहुंच सकते हैं, लेकिन आखिरकार आप अपने पावर उपयोगकर्ताओं को काफी शक्ति दे रहे हैं। चूंकि यह एक समृद्ध ग्राहक के लिए है जो उपयोगकर्ता की मशीन पर चलता है, इसलिए एक दुर्भावनापूर्ण उपयोगकर्ता पूरे ऐप को क्रैश या यहां तक ​​कि कचरा भी कर सकता है अगर उन्हें वास्तव में ऐसा लगता है। लेकिन यह दुर्घटनाग्रस्त होने का उनका उदाहरण है। इसे अच्छी तरह से दस्तावेज करें और लोगों को बताएं कि क्या स्पर्श नहीं करना है।

कहा कि, मुझे लगता है कि उपयोगकर्ता इनपुट और हाँ, कॉल eval इस तरह अमल वेब ऐप्लिकेशन के लिए बात की इस तरह किया है:

eval(code, {"__builtins__":None}, {safe_functions}) 

जहां safe_functions कार्यों आप चाहते हैं की {"name": func} प्रकार जोड़े युक्त एक शब्दकोश है आपके उपयोगकर्ता तक पहुंचने में सक्षम हैं। अगर वहाँ कुछ आवश्यक डेटा संरचना है कि आप कर रहे हैं सकारात्मक अपने उपयोगकर्ताओं पर प्रहार करने के लिए, बस इसे globals से बाहर पॉप उन्हें पार करने से पहले।

संयोग चाहते कभी नहीं होगा है, गुइडो थोड़ी देर पहले अपने ब्लॉग पर इस मुद्दे को संबोधित किया। मैं देखूंगा कि मैं इसे पा सकता हूं या नहीं।

संपादित करें:found.

+0

"आसान जवाब: मत करो।" -HA! सच है, हालांकि यह ऐप बनाने में मेरा इरादा था 1) पाइथन के बारे में बहुत कुछ सीखें 2) एक ऐसा एप्लिकेशन बनाएं जो वास्तव में कुशलतापूर्वक और शक्तिशाली ढंग से उपयोग किया जा सके। मुझे पता है कि उपयोगकर्ता को कुछ तोड़ने से पूरी तरह से रोकना असंभव है, जिससे उन्हें कोड चलाने की अनुमति नहीं मिलती है। लेकिन निश्चित रूप से ऐप को क्रैश होने से रोकना संभव है यदि कोड एक त्रुटि उठाता है जिसे उन्होंने उन परिस्थितियों में अपेक्षा नहीं की थी जिन्हें उन्होंने उम्मीद नहीं की थी। या अगर यह लटक रहा है तो उनके कोड के निष्पादन को रोकें क्योंकि कुछ ख़राब हो गया है। – Ryex

+0

मेरा मतलब था कि इसे प्रतिबंधित न करें। पॉवर उपयोगकर्ताओं के लिए स्क्रिप्टिंग कार्यक्षमता जोड़ना बहुत अच्छा है, लेकिन चेतावनी है कि वे सामान तोड़ सकते हैं बहुत अधिक सार्वभौमिक रूप से लागू होते हैं। – nmichaels

+1

आप इसके बजाय PyV8 जैसे कुछ एम्बेड कर सकते हैं (http://code.google.com/p/pyv8/), तो आपको अभी भी एक पूर्ण प्रोग्रामिंग भाषा मिल जाएगी, लेकिन आपको अपने स्वयं के ग्लोबल्स प्रदान करना होगा और अतिरिक्त निर्भरता जोड़नी होगी । –

1

लघु जवाब: नहीं

अन्य संबंधित पोस्ट:

सुरक्षा नेट बनाना आसान नहीं है। जानकारी के बहुत सारे और चालाक हैक्स के आसपास रहे हैं:

अपने डिजाइन लक्ष्यों पर:

यह आप पर उपयोगकर्ता प्रदान करके एक विस्तृत प्रणाली का निर्माण करने कोशिश कर रहे हैं बहुत सारे व्यवहार और तर्क को संशोधित करें।

सबसे आसान विकल्प उनको एक स्क्रिप्ट लिखने के लिए कहना है जिसे आप प्रोग्राम चलाने के दौरान मूल्यांकन (eval) कर सकते हैं।

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

+0

मैं अंतिम भाग से पूरी तरह सहमत नहीं हूं और न ही असहमत हूं। एक एप्लिकेशन जो मुझे स्क्रिप्ट स्वयं देता है, मुझे और अधिक उत्पादक होने में मदद करेगा (ओह, उन सभी एक्स को वाई होना चाहिए ... अच्छा, मैं एक लूप लिखूंगा जो इसे ठीक करता है)। उन्नत उपयोगकर्ताओं की सहायता के लिए यह एक सस्ता समाधान है। लेकिन निश्चित रूप से "वास्तविक" विन्यास और प्लगइन्स बहुत सुविधाजनक हैं, और अधिक उपयोगकर्ताओं के लिए भी पहुंच योग्य हैं। – delnan

+0

@ डेलनान: मैं पूरी तरह से आपसे सहमत हूं। लेकिन अधिकांश उपयोगकर्ताओं के लिए, यह अभी भी अधिक उपयोगी है प्लगइन, स्क्रिप्टिंग एपीआई आदि के माध्यम से विस्तारशीलता प्रदान करते हैं।एक उन्नत उपयोगकर्ता जो काम करेगा वह बहुत ही रचनात्मक होगा लेकिन रिक्त स्लेट आमतौर पर अधिकांश उपयोगकर्ताओं के साथ अच्छी तरह से काम नहीं करता है। – pyfunc

0

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

0

यदि आपके पास टिंकर पर स्विच करने का विकल्प है तो आप अपनी स्क्रिप्ट को संसाधित करने के लिए बंडल किए गए टीसीएल दुभाषिया का उपयोग कर सकते हैं। यदि आप टीके इवेंट लूप शुरू नहीं करते हैं तो उस मामले के लिए आप शायद wxpython ऐप के साथ ऐसा कर सकते हैं; किसी भी खिड़कियां बनाये बिना बस टीसीएल दुभाषिया का उपयोग करें।

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

पायथन - एक अंतर्निहित स्क्रिप्टिंग इंजन के साथ एकमात्र स्क्रिप्टिंग भाषा :-)।

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