मैं एक ऐसा एप्लिकेशन लिख रहा हूं जहां उपयोगकर्ता एक पायथन स्क्रिप्ट दर्ज कर सकते हैं और इसे सैंडबॉक्स में निष्पादित कर सकते हैं। मुझे निष्पादित कोड को कुछ मॉड्यूल आयात करने से रोकने के लिए एक तरीका चाहिए, इसलिए दुर्भावनापूर्ण कोड एक समस्या का अधिक नहीं होगा। क्या Python में ऐसा करने का कोई तरीका है?कुछ मॉड्यूल आयात करने से पाइथन कोड को रोकना?
उत्तर
आप आयात तंत्र को अधिभारित कर सकते हैं। हमने प्लगइन के लिए लाइसेंसिंग सिस्टम रखने के लिए इसका इस्तेमाल किया था, आप आसानी से मॉड्यूल नामों की श्वेतसूची/ब्लैकलिस्ट कर सकते हैं।
दुर्भाग्य से, मुझे लगता है कि आप क्या करने की कोशिश कर रहे हैं क्या मौलिक असंभव है। यदि उपयोगकर्ता आपके आवेदन में मनमानी कोड निष्पादित कर सकते हैं तो वे जो चाहें कर सकते हैं। यहां तक कि यदि आप उन्हें कुछ मॉड्यूल आयात करने से रोकने में सक्षम थे, तो उन्हें कुछ भी समान कार्यक्षमता लिखने से रोक नहीं पाएगा (स्क्रैच से या उपलब्ध कुछ मॉड्यूल का उपयोग करके)।
मैं वास्तव में पायथन में एक sandbox को लागू करने की बारीकियों पता नहीं है, लेकिन मुझे लगता है यह कुछ है कि दुभाषिया स्तर पर किया जाना चाहिए और आसान से दूर है है कल्पना कर सकते हैं!
जो वह करने का प्रयास कर रहा है वह बेहद मुश्किल है, लेकिन असंभव से बहुत दूर है। यदि आप जो भी कर रहे हैं उसके आस-पास पर्याप्त रूप से डिज़ाइन करते हैं, तो आप अपने बैकएंड तक पहुंच को बाधित कर सकते हैं और इसे बंद कर सकते हैं, केवल उस चीज़ तक पहुंच प्रदान कर सकते हैं, जिसे देखने की अनुमति है, और हैकी कार्यान्वयन तक पहुंच प्रतिबंधित करने की अनुमति देता है। (प्रतिबंध के कई क्षेत्र हैं जिन्हें निजी बैकएंड नेमस्पेस से प्रतिबंधित वैरिएबल ऑपरेशन तक कवर करने की आवश्यकता है) – Tcll
क्या आपने python.org article on SandboxedPython और linked article चेक किया है?
उन पृष्ठों कीदोनों अन्य संसाधनों के लिंक हैं।
विशेष रूप से, पीपीपीआई RestrictedPython आपको यह निर्धारित करने देता है कि क्या उपलब्ध है, और इसमें से कुछ 'सुरक्षित' डिफ़ॉल्ट हैं। , (मदद करने के लिए मॉड्यूल है कि App इंजन के उत्पादन मामलों में उपलब्ध नहीं बना रहे हैं आयात करने की कोशिश कोड का पता लगाने)
मुझे उल्लेख करना चाहिए था कि मेरा ऐप Google App Engine पर चलता है। तो, एक तरफ मेरे पास पहले से ही बहुत सैंडबॉक्सिंग है, लेकिन ओटीओएच मुझे यकीन नहीं है कि मैं प्रतिबंधित पाइथन का उपयोग कर सकता हूं। मैं निश्चित रूप से कोशिश करूँगा, धन्यवाद! –
Google अनुप्रयोग इंजन का ओपन सोर्स SDK यांत्रिकी की एक विस्तृत और ठोस कार्यान्वयन है अवांछित मॉड्यूल के आयात को रोकने के लिए, हालांकि यहां तक कि अगर उपयोगकर्ता कोड केवल गलत होने के बजाए बुरा था, तो इसे तोड़ दिया जा सकता है (उत्पादन के उदाहरणों में स्पष्ट रूप से रक्षा की अधिक परतें होती हैं, जैसे कि बस उन मॉड्यूल को बिल्कुल नहीं; ;)।
तो यह सब कैसे में गहराई से अपने रक्षा करने की जरूरत है पर निर्भर करता है। एक चरम पर आप कहीं भी __import__
बिल्टिन को छीन लें और इसे अपने फ़ंक्शन से प्रतिस्थापित करें जो __builtin__
पर प्रतिनिधि होने से पहले आपके द्वारा इच्छित सभी चेक करता है; कि,, को लागू करने और अच्छी तरह से परीक्षण करने के लिए कोड का शायद 20 लाइनों, 30 मिनट है ... लेकिन यह लंबे समय के लिए आप की रक्षा नहीं हो सकता है कि कोई विश्वसनीयता की दृष्टि मुझे एक लाख रुपये अपने सिस्टम में तोड़ (और की पेशकश की परिकल्पित मैं नहीं था अच्छा-दो-जूते प्रकार का लड़का मैं वास्तव में हूँ, निश्चित रूप से ;-)। दूसरी तरफ आप रक्षा की परतों की एक गहराई से श्रृंखला तैनात करते हैं जो कार्यान्वयन और परीक्षण कार्य के हजारों लाइनों और हफ्तों ले सकता है - इस तरह के संसाधन बजट को देखते हुए मैं निश्चित रूप से I को लागू करने में असमर्थ हूं (लेकिन हमेशा जोखिम होता है कि कोई ईएलएसई स्मार्ट है और मैं जितना पाइथन-समझदार हूं, ज़ाहिर है!)।
तो, आप कितना गहरा जाने के लिए चाहते हैं, या कहें, तो आप कितना गहरा जाने के लिए खर्च कर सकते हैं ...?
मैं एनएसए स्तर की आवश्यकताओं/बजट से बहुत दूर हूं, इसलिए मुझे लगता है कि मैं __import__ को ओवरराइड करने का विकल्प चुनूंगा और यदि पाइथन कुकबुक के लेखक को सुरक्षा तोड़ने के लिए एक मिलियन डॉलर का लेखक रखता है, तो केवल परिणाम भुगतेंगे .. कोई भी पॉइंटर्स ऐसा करने के लिए कैसे जाना है? पायथन के लिए अपेक्षाकृत नया होने के नाते मुझे एक साधारण समाधान नहीं मिल रहा है। धन्यवाद! –
ऐप इंजन के उत्पादन उदाहरणों को दृढ़ता से संरक्षित किया गया है, जैसा कि मैंने रक्षा की कई परतों के साथ कहा था: मुझे नहीं पता कि उनको कैसे तोड़ना है (अगर मैंने किया, तो मैं निश्चित रूप से इसे अपने नियोक्ता, या मेरे कई दोस्तों को निजी रूप से संवाद दूंगा जो ऐप इंजन टीम में काम करते हैं, इसलिए मुझे इसे समझने के तुरंत बाद रिसाव ठीक कर दिया जाएगा ;-)। बस इस बात पर विचार करें कि जैसे ही आपका कोड बिल्टिन '__import__' को ओवरराइड कर सकता है, तो आप जिस कोड को आयात कर रहे हैं, हो सकता है, इसलिए, इसके खिलाफ भी बचाव करें; और, "डिफ़ॉल्ट इनकार" स्टैंस का उपयोग करें, जहां केवल विशिष्ट मॉड्यूल की अनुमति है, विशिष्ट लोगों को वर्जित किए जाने की बजाय! - –
मानते हैं कि संदिग्ध कोड चल रहे प्रोग्राम में एक स्ट्रिंग के रूप में जोड़ा गया है जो प्रोग्राम "निष्पादित" होगा, यदि यह प्रोग्राम पाइंस्टॉलर में बंडल किया गया था, तो इस कोड के लिए नए मॉड्यूल आयात करना असंभव नहीं होगा, और इसलिए वास्तव में उन मॉड्यूल तक पहुंच नहीं है जो मुख्य प्रोग्राम द्वारा आयात नहीं किए जाते हैं क्योंकि फ़ाइलों को निष्पादन योग्य में शामिल नहीं किया जाता है? –
यदि आप एक मॉड्यूल का नाम लिए sys.modules में कोई भी कहें, में आयात योग्य नहीं होगा ...
>>> import sys
>>> import os
>>> del os
>>> sys.modules['os']=None
>>> import os
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named os
>>>
यह वास्तविक मॉड्यूल आयात करने से पहले भी काम करता है। –
@ डॉकटोरोइचर्ड एरम्म ..., यही वह है जो वह प्रदर्शित कर रहा है ('डेल ओएस') ... – idmean
8 वर्ष, Yeesh, और कोई भी इस एक पता लगा लिया गया है? :/
आप import
कथन को ओवरराइड कर सकते हैं या __import__
फ़ंक्शन उर्फ कर सकते हैं।
यह सिर्फ एक परीक्षण किया जाता है आड़ी-तिरछी रेखाएं-कोड, क्योंकि मैं किसी भी कानूनी संदर्भ नहीं मिल सका:
Python 3.4.3 |Anaconda 2.3.0 (32-bit)| (default, Mar 6 2015, 12:08:17) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
B ('f',) 0
imported secure module
>>> from B import f
B ('f',) 0
linecache None 0
encodings.utf_8 ['*'] 0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
from B import f
File "\home\tcll\Projects\python\test\restricted imports\main.py", line 11, in secure_importer
raise ImportError("module '%s' is restricted."%name)
ImportError: module 'B' is restricted.
>>> import C
>>>
कृपया मुझे के बारे में टिप्पणी नहीं करते:
import importlib
def secure_importer(name, globals=None, locals=None, fromlist=(), level=0):
if name != 'C': print(name, fromlist, level)
# not exactly a good verification layer
frommodule = globals['__name__'] if globals else None
if name == 'B' and frommodule != 'C':
raise ImportError("module '%s' is restricted."%name)
return importlib.__import__(name, globals, locals, fromlist, level)
__builtins__.__dict__['__import__'] = secure_importer
import C
कि कोड के लिए परीक्षण और यहाँ है Python34 का उपयोग करके, मेरे पास मेरे कारण हैं, और यह मेरे प्राथमिक प्रोजेक्ट के लिए विशेष रूप से चीजों (जैसे उपरोक्त कोड) की जांच के लिए लिनक्स पर मेरा प्राथमिक दुभाषिया है।
- 1. गतिशील रूप से पाइथन मॉड्यूल आयात करना
- 2. पाइथन मॉड्यूल आयात करने में समस्याएं
- 3. गतिशील रूप से पाइथन मॉड्यूल आयात करना
- 4. "आयात मॉड्यूल" और फिर "पैकेज आयात मॉड्यूल से" मॉड्यूल को फिर से लोड क्यों करता है?
- 5. सब कुछ आयात करना (*) मॉड्यूल से गतिशील रूप से
- 6. मॉड्यूल और वैश्विक चरों में पाइथन आयात
- 7. आयात पाइथन मॉड्यूल पथ पर नहीं
- 8. एम्बेडिंग अजगर - आयात करने मॉड्यूल
- 9. क्या एक पाइथन मॉड्यूल आयात को वापसी की तरह कुछ खत्म करना संभव है?
- 10. पाइथन मॉड्यूल
- 11. मॉड्यूल को दो बार आयात करने से कैसे रोकें?
- 12. आयातित मॉड्यूल को कैशिंग करने से पाइथन को रोकें
- 13. एंड्रॉइड एनडीके आयात-मॉड्यूल/कोड पुन: उपयोग
- 14. बिल्ट-इन मॉड्यूल के समान नाम के साथ मॉड्यूल आयात करने का प्रयास करने से आयात त्रुटि
- 15. जेथॉन मॉड्यूल से जावा कक्षाओं को आयात करने में असमर्थ
- 16. पाइथन मॉड्यूल से कोड चलाएं, मॉड्यूल को संशोधित करें, फिर इंटरपेटर
- 17. मैं पाइथन मॉड्यूल को स्वयं आयात करने से कैसे रोक सकता हूं?
- 18. किसी अन्य फ़ोल्डर से विफल पाइथन आयात
- 19. पैकेज से मॉड्यूल आयात करने के लिए पाइथोनिक तरीका
- 20. आयात मॉड्यूल
- 21. स्रोत निर्देशिका से आयात करते समय पाइथन 'आयात त्रुटि' पकड़ें
- 22. मैं पाइथन आयात को ओवरराइड कैसे करूं?
- 23. पाइथन में फ़ंक्शन आयात करने के तरीके को कैसे ढूंढें?
- 24. वर्तमान निर्देशिका से मॉड्यूल आयात करने के लिए फोर्स
- 25. कुछ सिस्टम कॉल निष्पादित करने के लिए प्रक्रियाओं को रोकना
- 26. ElementTree आयात करने में पाइथन त्रुटि को कैसे ठीक करें?
- 27. विनफॉर्म को अधिकतम करने से रोकना?
- 28. क्या ओबीजेसी से पाइथन मॉड्यूल को कॉल करना संभव है?
- 29. पाइथन मॉड्यूल को दो बार आयात करने का कारण क्या हो सकता है?
- 30. आयात त्रुटि: कोई मॉड्यूल नामित
इस उत्तर को किसी भी प्रयोग की आवश्यकता है – Schollii