दिलचस्प पोस्ट
निर्दिष्ट अवधि में लॉग फाइल से डेटा निकालने जूनिट परीक्षा कक्षाओं में स्प्रिंग एप्लीकेशन संदर्भ का पुन: उपयोग करें अस्पष्ट PHP कोड आईओएस पता लगाता है कि उपयोगकर्ता iPad पर है या नहीं आईओएस-चार्ट में एक्स एक्सस पर स्ट्रिंग्स को कैसे जोड़ें? शुद्ध सीएसएस आधारित ड्रॉपडाउन मेनू कैसे बनाऊँ? यह कैसे पहचानें कि आप वीएम के तहत चल रहे हैं? आकार रंग गतिशील रूप से कैसे परिवर्तित करें? XPath मूल्यांकन से पहले स्ट्रिंग में डबल उद्धरण कैसे संभालना है? ओरेकल: लेन-देन लंबित है या नहीं पता कैसे? लॉगरिदमिक स्केल और कस्टम ब्रेक के साथ हिस्टोग्राम एक ही पृष्ठ पर आधार भूखंड और grid.tables व्यवस्थित करें सी में यादृच्छिक फ्लोट संख्या कैसे उत्पन्न करें क्वेरी में सिंटेक्स बदलें PHP में यूआरएल को पोस्ट डेटा

पायथन के 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) अधिकांश मामलों में असुरक्षित है।

Solutions Collecting From Web of "पायथन के 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() के गैर-सुरक्षा पर एक बहुत अच्छा लेख है ।

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

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