2009-08-29 13 views
10

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

उत्तर

0

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

+8

इस उत्तर को किसी भी प्रयोग की आवश्यकता है – Schollii

1

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

मैं वास्तव में पायथन में एक sandbox को लागू करने की बारीकियों पता नहीं है, लेकिन मुझे लगता है यह कुछ है कि दुभाषिया स्तर पर किया जाना चाहिए और आसान से दूर है है कल्पना कर सकते हैं!

+0

जो वह करने का प्रयास कर रहा है वह बेहद मुश्किल है, लेकिन असंभव से बहुत दूर है। यदि आप जो भी कर रहे हैं उसके आस-पास पर्याप्त रूप से डिज़ाइन करते हैं, तो आप अपने बैकएंड तक पहुंच को बाधित कर सकते हैं और इसे बंद कर सकते हैं, केवल उस चीज़ तक पहुंच प्रदान कर सकते हैं, जिसे देखने की अनुमति है, और हैकी कार्यान्वयन तक पहुंच प्रतिबंधित करने की अनुमति देता है। (प्रतिबंध के कई क्षेत्र हैं जिन्हें निजी बैकएंड नेमस्पेस से प्रतिबंधित वैरिएबल ऑपरेशन तक कवर करने की आवश्यकता है) – Tcll

13

क्या आपने python.org article on SandboxedPython और linked article चेक किया है?

उन पृष्ठों की

दोनों अन्य संसाधनों के लिंक हैं।

विशेष रूप से, पीपीपीआई RestrictedPython आपको यह निर्धारित करने देता है कि क्या उपलब्ध है, और इसमें से कुछ 'सुरक्षित' डिफ़ॉल्ट हैं। , (मदद करने के लिए मॉड्यूल है कि App इंजन के उत्पादन मामलों में उपलब्ध नहीं बना रहे हैं आयात करने की कोशिश कोड का पता लगाने)

+0

मुझे उल्लेख करना चाहिए था कि मेरा ऐप Google App Engine पर चलता है। तो, एक तरफ मेरे पास पहले से ही बहुत सैंडबॉक्सिंग है, लेकिन ओटीओएच मुझे यकीन नहीं है कि मैं प्रतिबंधित पाइथन का उपयोग कर सकता हूं। मैं निश्चित रूप से कोशिश करूँगा, धन्यवाद! –

7

Google अनुप्रयोग इंजन का ओपन सोर्स SDK यांत्रिकी की एक विस्तृत और ठोस कार्यान्वयन है अवांछित मॉड्यूल के आयात को रोकने के लिए, हालांकि यहां तक ​​कि अगर उपयोगकर्ता कोड केवल गलत होने के बजाए बुरा था, तो इसे तोड़ दिया जा सकता है (उत्पादन के उदाहरणों में स्पष्ट रूप से रक्षा की अधिक परतें होती हैं, जैसे कि बस उन मॉड्यूल को बिल्कुल नहीं; ;)।

तो यह सब कैसे में गहराई से अपने रक्षा करने की जरूरत है पर निर्भर करता है। एक चरम पर आप कहीं भी __import__ बिल्टिन को छीन लें और इसे अपने फ़ंक्शन से प्रतिस्थापित करें जो __builtin__ पर प्रतिनिधि होने से पहले आपके द्वारा इच्छित सभी चेक करता है; कि,, को लागू करने और अच्छी तरह से परीक्षण करने के लिए कोड का शायद 20 लाइनों, 30 मिनट है ... लेकिन यह लंबे समय के लिए आप की रक्षा नहीं हो सकता है कि कोई विश्वसनीयता की दृष्टि मुझे एक लाख रुपये अपने सिस्टम में तोड़ (और की पेशकश की परिकल्पित मैं नहीं था अच्छा-दो-जूते प्रकार का लड़का मैं वास्तव में हूँ, निश्चित रूप से ;-)। दूसरी तरफ आप रक्षा की परतों की एक गहराई से श्रृंखला तैनात करते हैं जो कार्यान्वयन और परीक्षण कार्य के हजारों लाइनों और हफ्तों ले सकता है - इस तरह के संसाधन बजट को देखते हुए मैं निश्चित रूप से I को लागू करने में असमर्थ हूं (लेकिन हमेशा जोखिम होता है कि कोई ईएलएसई स्मार्ट है और मैं जितना पाइथन-समझदार हूं, ज़ाहिर है!)।

तो, आप कितना गहरा जाने के लिए चाहते हैं, या कहें, तो आप कितना गहरा जाने के लिए खर्च कर सकते हैं ...?

+0

मैं एनएसए स्तर की आवश्यकताओं/बजट से बहुत दूर हूं, इसलिए मुझे लगता है कि मैं __import__ को ओवरराइड करने का विकल्प चुनूंगा और यदि पाइथन कुकबुक के लेखक को सुरक्षा तोड़ने के लिए एक मिलियन डॉलर का लेखक रखता है, तो केवल परिणाम भुगतेंगे .. कोई भी पॉइंटर्स ऐसा करने के लिए कैसे जाना है? पायथन के लिए अपेक्षाकृत नया होने के नाते मुझे एक साधारण समाधान नहीं मिल रहा है। धन्यवाद! –

+0

ऐप इंजन के उत्पादन उदाहरणों को दृढ़ता से संरक्षित किया गया है, जैसा कि मैंने रक्षा की कई परतों के साथ कहा था: मुझे नहीं पता कि उनको कैसे तोड़ना है (अगर मैंने किया, तो मैं निश्चित रूप से इसे अपने नियोक्ता, या मेरे कई दोस्तों को निजी रूप से संवाद दूंगा जो ऐप इंजन टीम में काम करते हैं, इसलिए मुझे इसे समझने के तुरंत बाद रिसाव ठीक कर दिया जाएगा ;-)। बस इस बात पर विचार करें कि जैसे ही आपका कोड बिल्टिन '__import__' को ओवरराइड कर सकता है, तो आप जिस कोड को आयात कर रहे हैं, हो सकता है, इसलिए, इसके खिलाफ भी बचाव करें; और, "डिफ़ॉल्ट इनकार" स्टैंस का उपयोग करें, जहां केवल विशिष्ट मॉड्यूल की अनुमति है, विशिष्ट लोगों को वर्जित किए जाने की बजाय! - –

+0

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

18

यदि आप एक मॉड्यूल का नाम लिए 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 
>>> 
+1

यह वास्तविक मॉड्यूल आयात करने से पहले भी काम करता है। –

+1

@ डॉकटोरोइचर्ड एरम्म ..., यही वह है जो वह प्रदर्शित कर रहा है ('डेल ओएस') ... – idmean

0

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 का उपयोग करके, मेरे पास मेरे कारण हैं, और यह मेरे प्राथमिक प्रोजेक्ट के लिए विशेष रूप से चीजों (जैसे उपरोक्त कोड) की जांच के लिए लिनक्स पर मेरा प्राथमिक दुभाषिया है।

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