मैं एक 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, या फ्रीज द्वारा जमे हुए समस्याओं के कारण हो सकता है? क्या होगा यदि वे मानक पुस्तकालय के एक मोडल आउट पक्ष कहते हैं? क्या यह पर्याप्त होगा कि मोडल एक ही निर्देशिका में जमे हुए निष्पादन योग्य के रूप में मौजूद है?
मैं इन उत्तरों को एक नया प्रश्न बनाने के साथ प्राप्त करना चाहता हूं लेकिन मुझे यह करना होगा।
ईवल पूरी तरह से सुरक्षित आईएमओ बनाने के लिए व्यावहारिक रूप से असंभव है (लेकिन यह विशेषज्ञता का मेरा मुख्य क्षेत्र नहीं है, मैं अपने गधे से बात कर रहा हूं)। इसके लिए प्लग-इन संरचना के साथ एक एपीआई विकसित करने का तरीका क्यों नहीं है, अगर सुरक्षा/एकीकरण और कार्यक्षमता का दायरा चिंता का विषय है? –
अरे, कम से कम यह 'exec' नहीं है। – nmichaels
कम से कम, यह मान लें कि यह उन वास्तव में, वास्तव में दुर्लभ उदाहरणों में से एक है जहां एक को पकड़ना-'सब-सब' को छोड़कर: 'समझ में आता है और इसे लागू करता है। पूरे ऐप को क्रैश करने की कोई आवश्यकता नहीं है क्योंकि एक उपयोगकर्ता अपेक्षाकृत नया पाइथन अंतरिक्ष से चूक गया है। +1 और पसंदीदा, मैं भी एक ऐप में एक पायथन आरईपीएल को शामिल करने की उम्मीद कर रहा हूं। – delnan