2009-03-19 4 views
22

मैं eval() का उपयोग कर एक अजगर स्ट्रिंग का मूल्यांकन कर रहा हूँ, और इस तरह के एक वर्ग है, तो:अविश्वासित तारों पर पायथन के eval() की सुरक्षा?

class Foo(object): 
    a = 3 
    def bar(self, x): return x + a 

सुरक्षा जोखिम अगर मैं स्ट्रिंग पर भरोसा नहीं करते क्या हैं? विशेष रूप से:

  1. eval(string, {"f": Foo()}, {}) असुरक्षित है? यही है, क्या आप ओएस या सीएस या फू इंस्टेंस से असुरक्षित कुछ तक पहुंच सकते हैं?
  2. eval(string, {}, {}) असुरक्षित है? यही है, क्या मैं पूरी तरह से लेन और सूची जैसे बिल्टिन से ओएस या sys तक पहुंच सकता हूं?
  3. क्या अंतर्निहित संदर्भ में बिल्टिन मौजूद नहीं हैं?

जैसे कुछ असुरक्षित तार कर रहे हैं "[0] * 100000000" मैं, के बारे में परवाह नहीं है क्योंकि सबसे खराब वे धीमी गति से/कार्यक्रम बंद करो। मैं मुख्य रूप से कार्यक्रम के बाहर उपयोगकर्ता डेटा की सुरक्षा के बारे में चिंतित हूं।

स्पष्ट रूप से, eval(string) कस्टम शब्दकोशों के बिना अधिकांश मामलों में असुरक्षित है।

+0

हां, यदि स्ट्रिंग में आयात sys sys.dostuff है तो आप eval कर रहे हैं और आपको भरोसा नहीं है कि तारों की चीजें असली बदसूरत हो सकती हैं। – Vasil

+0

eval अच्छी संपत्ति है केवल यह अभिव्यक्ति की अनुमति देता है। तो =, आयात, और प्रिंट जैसी चीजों की अनुमति नहीं है। –

+6

'eval (' __ आयात __ ("sys") का प्रयास करें। Stdout.write ("हैलो जो") ') –

उत्तर

13

आप इस तरह के ब्लैकलिस्ट दृष्टिकोण के साथ eval सुरक्षित नहीं कर सकते हैं। इनपुट के उदाहरणों के लिए Eval really is dangerous देखें जो सीपीथॉन दुभाषिया को सीगफॉल्ट करेगा, आपको पसंद की किसी भी कक्षा तक पहुंच प्रदान करेगा, और इसी तरह।

43

eval() दुर्भावनापूर्ण डेटा को आपके पूरे सिस्टम से समझौता करने, अपनी बिल्ली को मारने, अपने कुत्ते को खाने और अपनी पत्नी से प्यार करने की अनुमति देगा।

हाल ही में कैसे अजगर-देव की सूची पर सुरक्षित रूप से बात इस तरह का करने के बारे में एक धागा था, और निष्कर्ष थे:

  • यह इस ठीक से करने के लिए बहुत मुश्किल है।
  • इसे कई वर्गों के हमलों को रोकने के लिए पाइथन दुभाषिया को पैच की आवश्यकता होती है।
  • इसे तब तक न करें जब तक कि आप वास्तव में नहीं चाहते हैं।

यहाँ प्रारंभ चुनौती के बारे में पढ़ने के लिए: http://tav.espians.com/a-challenge-to-break-python-security.html

क्या स्थिति आप में eval() का उपयोग करना चाहते हैं? क्या आप चाहते हैं कि कोई उपयोगकर्ता मनमाने ढंग से अभिव्यक्ति निष्पादित करने में सक्षम हो? या आप किसी भी तरह से डेटा स्थानांतरित करना चाहते हैं? शायद किसी भी तरह से इनपुट को लॉक करना संभव है।

+2

+1: दुर्भावनापूर्ण व्यक्ति कौन सा दुर्भावनापूर्ण कोड डालने वाला है जिसे आप eval() - ing? उस व्यक्ति को ढूंढें - गंभीरता से। अधिकांश 'eval असुरक्षित है' कुछ बुराई व्यक्ति के बारे में hypothetical हाथ से waving है कि कोई भी वास्तव में पहचान सकते हैं। –

+7

@ एस। लॉट - क्या सुरक्षा के पीछे ड्राइविंग विचारों में से एक नहीं है * खराब चीजों को रोकने के बजाय बाद में उम्मीद है कि आप दोनों हमलावर की पहचान कर सकते हैं और उन्हें फिर से नहीं करने के लिए मना सकते हैं? अच्छे प्रथाओं को हतोत्साहित क्यों करें? –

+2

ऐसी स्थिति जहां आपके सिस्टम पर चलाने के लिए अविश्वसनीय कोड लिखने के लिए अधिक इंटरनेट पर एक व्यक्ति की आवश्यकता होती है कि अविश्वासित व्यक्ति हमला करने में असमर्थ हों। "यह व्यक्ति कौन है" - अगर आपने eval() के साथ कुछ असुरक्षित लिखा और मुझे पता था? यह आपको दिखाएगा कि आपको ऐसा नहीं करना चाहिए था। – Jerub

4

आप शायद सवाल चारों ओर मोड़ से बेहतर कर रहे हैं:

  1. भाव किस तरह आप eval के लिए इच्छुक रहे हैं?
  2. क्या आप बीमा कर सकते हैं कि कुछ संकीर्ण परिभाषित वाक्यविन्यास से मेल खाने वाले स्ट्रिंग eval() डी हैं?
  3. फिर पर विचार करें कि सुरक्षित है।

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

+0

या, इस पर विचार करें: उस व्यक्ति को ढूंढें जो दुर्भावनापूर्ण कोड को आपके eval अभिव्यक्तियों में डालता रहता है। उस व्यक्ति को उनके सामाजिक-सामाजिक व्यवहार के परिणामों पर शिक्षित करें। गंभीरता से। Eval अभिव्यक्तियों में कोड कौन डाल रहा है? –

+3

@ एसएलॉट - यदि वह क्रिप्टोग्राफी प्रोग्राम लिख रहा है तो यह कैरल या ईव है, और ईमेल के लिए इसके [email protected] को संभालने के लिए है, लेकिन मुझे नहीं पता कि हमने कभी यह पहचाना है कि यह सामान्य मामले में कौन है। – MarkusQ

+0

मैं एक कदम आगे जाऊंगा और पूछूंगा * क्यों * आप इसे बिल्कुल करना चाहते हैं। –

6

ध्यान दें कि अगर आप खाली शब्दकोशों को eval() में पास करते हैं, तो भी कुछ सिंटैक्स चाल के साथ सीगफॉल्ट (सी) पायथन को अभी भी संभव है।उदाहरण के लिए, अपने दुभाषिया पर इस कोशिश: __import__('os'): eval("()"*8**5)

+0

क्या आप उन चालों का एक उदाहरण पोस्ट कर सकते हैं? – phihag

+0

वाह, यह एक segfault क्यों कारण था? – jacob

+1

यह कंपाइलर के ढेर को बहती है। –

9

आप os का उपयोग कर builtin कार्यों के लिए मिल सकता है।

पायथन 2.6+ के लिए, ast module मदद कर सकता है; विशेष रूप से ast.literal_eval, हालांकि यह वास्तव में उस पर निर्भर करता है जिसे आप eval करना चाहते हैं।

2

मार्क पिल्ग्रीम के Dive into Python ट्यूटोरियल में बहुत अच्छा article on the un-safety of eval() है।

इस लेख से उद्धरित:

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

+1

लिंक अब मान्य नहीं है। – GingerPlusPlus

+0

@ जिंजरप्लसप्लस: धन्यवाद, ऐसा लगता है कि मार्क ने अपना डोमेन ले जाया है। मैंने लिंक अपडेट कर दिए हैं। –

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