2013-03-12 4 views
13

मैं एक ऐसे वेब ऐप पर काम कर रहा हूं जहां उपयोगकर्ता स्ट्रिंग्स को आपूर्ति करने में सक्षम होंगे कि सर्वर वैरिएबल को प्रतिस्थापित करेगा।क्या पाइथन की स्ट्रिंग .format() अविश्वसनीय प्रारूप तारों के लिए सुरक्षित हो सकती है?

अधिमानतः मैं पीईपी 3101 प्रारूप() वाक्यविन्यास का उपयोग करना चाहता हूं और मैं इसे अविश्वसनीय इनपुट के लिए सुरक्षित बनाने के लिए फ़ॉर्मेटर में ओवरराइडिंग विधियों की व्यवहार्यता को देख रहा हूं। ।

  • पैडिंग आप मनमाने ढंग से लंबाई निर्दिष्ट करते हैं, तो '{:> 9999999999}' कर सकते हैं:

    यहाँ जोखिम मैं .format (साथ देख सकते हैं) के रूप में यह खड़ा कर रहे हैं प्रारूप (..) चला सकते हैं सर्वर मेमोरी से बाहर है और एक डॉस हो। मुझे इसे अक्षम करने की आवश्यकता होगी।

  • प्रारूप आपको वस्तुओं के अंदर के क्षेत्रों तक पहुंचने देता है, जो उपयोगी है, लेकिन यह डरावना है कि आप डंडर चर का उपयोग कर सकते हैं और मानक लाइब्रेरी के बिट्स में ड्रिलिंग शुरू कर सकते हैं। वहां कोई बात नहीं है कि एक गेटर() हो सकता है जिसमें साइड इफेक्ट्स हों या कुछ रहस्य लौटाएं। मैं get_field() को ओवरराइड करके विशेषता/अनुक्रमणिका एक्सेस को श्वेतसूची में डालूंगा।
  • मुझे स्वाभाविक रूप से कुछ अपवादों को पकड़ने की आवश्यकता होगी।

मेरे मान्यताओं हैं:

  • पारंपरिक सी प्रारूप स्ट्रिंग कारनामे में से कोई भी, अजगर पर लागू होते हैं क्योंकि एक पैरामीटर को निर्दिष्ट सीधे धागा के ढेर बंद पॉपिंग से, एक सीमा-जाँच की एक संग्रह में पहुँच है बल्कि ।
  • मैं जिस वेब ढांचे का उपयोग कर रहा हूं, वह प्रत्येक चर से बचता है जो पृष्ठ टेम्पलेट में प्रतिस्थापित होता है, और जब तक यह आउटपुट से पहले अंतिम स्टॉप है, मैं डी-एस्केपिंग से उभरने वाले क्रॉस-साइट स्क्रिप्टिंग हमलों से सुरक्षित हूं।

आपके विचार क्या हैं? मुमकिन? असंभव? केवल मूर्खतापूर्ण?


संपादित करें: आर्मिन Ronacher एक बुरा जानकारी लीक यदि आप दुंदर चर पहुँच को फ़िल्टर नहीं करतीं की रूपरेखा, लेकिन प्रारूप() के रूप में संभव हासिल करने के संबंध में लगता है:

{local_foo.__init__.__globals__[secret_global]}

http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

(व्यक्तिगत रूप से, मैं वास्तव में अपने उत्पाद में अविश्वसनीय प्रारूप() मार्ग नहीं चला था, लेकिन पूर्णता के लिए अद्यतन कर रहा हूं)

+0

मूर्खतापूर्ण लगता है। क्या आप सिर्फ 'प्रतिस्थापन() 'का उपयोग नहीं कर सकते? – grc

+0

ठीक है, एक प्रारंभिक प्रतिस्थापन के लिए() को प्रत्येक चर के लिए एक पास की आवश्यकता होती है जो स्ट्रिंग में हो सकती है, जो बहुत ही स्केल करेगा। –

+0

लेम्मी उस दृश्य पर विस्तार करते हैं क्योंकि मुझे इसे संपादित करने का मौका याद आया। मेरा उपयोग मामला एक एमयूडी जैसी स्थिति है जहां मैं कई संभावित चर के साथ स्ट्रिंग स्वरूपण का एक टन करने जा रहा हूं। मैं स्ट्रिंग स्वरूपण के कमजोर रूप में 'string.emplate' जैसे वापस जा सकता हूं, लेकिन वस्तुओं के अंदर के क्षेत्रों को संदर्भित करने में सक्षम होने के कारण भी मेरे मामले में बहुत उपयोगी है। यह कुछ ऐसा है जो मैं हर कॉल में प्रत्येक तर्क से प्रत्येक फ़ील्ड का पैरामीटर मैप बनाकर अनुकरण कर सकता हूं, लेकिन यह बेहतर होगा कि कुछ बेहतर स्केल करने के लिए आश्वस्त हो। –

उत्तर

5

अच्छा वृत्ति। हां, एक हमलावर मनमाने ढंग से प्रारूप स्ट्रिंग की आपूर्ति करने में सक्षम है पाइथन के तहत एक भेद्यता है।

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

python format string specification पर देखो और कार्यक्षमता को रोकें जो आप नहीं चाहते हैं कि उपयोगकर्ता रेगेक्स के साथ हो।

+7

या बेहतर अभी भी * * कार्यक्षमता की अनुमति दें जिसे आप समर्थन देना चाहते हैं, इसलिए जब आप पाइथन के नए संस्करण (और संभावित रूप से खतरनाक) प्रारूप विकल्पों के साथ अपग्रेड करते हैं, तो आप पकड़े नहीं जाते हैं। – Michael

+0

@ माइकल हाँ मैं सहमत हूं कि एक श्वेतसूची दृष्टिकोण बेहतर होगा। – rook

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