दिलचस्प पोस्ट
Android वेबदृश्य धीमा है jQuery वस्तु और DOM तत्व मैं SQL सर्वर पर MSDTC को कैसे सक्षम करूं? एचटीएमएल प्रपत्र: चयन-विकल्प बनाम दानवादी-विकल्प आईओएस विंडो की रूट व्यू नियंत्रक बदलना मेरे दो स्क्रीन में से एक पर डेटाग्रीड दृश्य का भयानक रेड्रा प्रदर्शन एचपीएल के साथ एचटीएमएल मेनू के लिए क्लास = 'सक्रिय' कैसे जोड़ते हैं Node.js में वातावरण चर पढ़ें रुबी के डबल-बृहदान्त्र `::` क्या है? स्ट्रिंग से नंबर निकालें निजी अंतिम स्थिर विशेषता बनाम निजी अंतिम विशेषता UITextField प्रोग्राम से प्रतिलिपि पेस्ट विकल्प को अक्षम कैसे करें Iquatable और बस ओवरराइड ऑब्जेक्ट के बीच अंतर क्या है। एक्वा ()? फ़ायरफ़ॉक्स में एचटीएमएल खींचें और ड्रॉप फ़ोल्डर पहचान। क्या यह संभव है? पायथन फ़ंक्शन या पद्धति से फ़ंक्शन या विधि का नाम कैसे प्राप्त करूं?

पायथन के eval () की सुरक्षा अविश्वसनीय स्ट्रिंग पर?

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

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

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

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

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

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

वेब के समाधान से एकत्रित समाधान "पायथन के eval () की सुरक्षा अविश्वसनीय स्ट्रिंग पर?"

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

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

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

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

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

क्या आप eval () का उपयोग करना चाहते हैं? क्या आप एक उपयोगकर्ता को मनमाना अभिव्यक्ति निष्पादित करने में सक्षम होना चाहते हैं? या आप किसी तरह से डेटा ट्रांसफर करना चाहते हैं? शायद किसी भी तरह से इनपुट को बंद करना संभव है

आप __import__('os') फ़ंक्शंस का इस्तेमाल कर सकते हैं: __import__('os')

अजगर 2.6+ के लिए, एट मॉड्यूल मदद कर सकता है; विशेष रूप से ast.literal_eval , हालांकि यह वास्तव में आप क्या करना चाहते हैं पर निर्भर करता है eval

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

आप संभवत: प्रश्न को चारों ओर मोड़ सकते हैं:

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

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

पिल्टन ट्यूटोरियल में मार्क पिलग्रीम के गोताखोर में eval() के गैर-सुरक्षा पर एक बहुत अच्छा लेख है ।

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

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