मैं एक ऐसे वेब ऐप पर काम कर रहा हूं जहां उपयोगकर्ता स्ट्रिंग्स को आपूर्ति करने में सक्षम होंगे कि सर्वर वैरिएबल को प्रतिस्थापित करेगा।क्या पाइथन की स्ट्रिंग .format() अविश्वसनीय प्रारूप तारों के लिए सुरक्षित हो सकती है?
अधिमानतः मैं पीईपी 3101 प्रारूप() वाक्यविन्यास का उपयोग करना चाहता हूं और मैं इसे अविश्वसनीय इनपुट के लिए सुरक्षित बनाने के लिए फ़ॉर्मेटर में ओवरराइडिंग विधियों की व्यवहार्यता को देख रहा हूं। ।
- पैडिंग आप मनमाने ढंग से लंबाई निर्दिष्ट करते हैं, तो '{:> 9999999999}' कर सकते हैं:
यहाँ जोखिम मैं .format (साथ देख सकते हैं) के रूप में यह खड़ा कर रहे हैं प्रारूप (..) चला सकते हैं सर्वर मेमोरी से बाहर है और एक डॉस हो। मुझे इसे अक्षम करने की आवश्यकता होगी।
- प्रारूप आपको वस्तुओं के अंदर के क्षेत्रों तक पहुंचने देता है, जो उपयोगी है, लेकिन यह डरावना है कि आप डंडर चर का उपयोग कर सकते हैं और मानक लाइब्रेरी के बिट्स में ड्रिलिंग शुरू कर सकते हैं। वहां कोई बात नहीं है कि एक गेटर() हो सकता है जिसमें साइड इफेक्ट्स हों या कुछ रहस्य लौटाएं। मैं get_field() को ओवरराइड करके विशेषता/अनुक्रमणिका एक्सेस को श्वेतसूची में डालूंगा।
- मुझे स्वाभाविक रूप से कुछ अपवादों को पकड़ने की आवश्यकता होगी।
मेरे मान्यताओं हैं:
- पारंपरिक सी प्रारूप स्ट्रिंग कारनामे में से कोई भी, अजगर पर लागू होते हैं क्योंकि एक पैरामीटर को निर्दिष्ट सीधे धागा के ढेर बंद पॉपिंग से, एक सीमा-जाँच की एक संग्रह में पहुँच है बल्कि ।
- मैं जिस वेब ढांचे का उपयोग कर रहा हूं, वह प्रत्येक चर से बचता है जो पृष्ठ टेम्पलेट में प्रतिस्थापित होता है, और जब तक यह आउटपुट से पहले अंतिम स्टॉप है, मैं डी-एस्केपिंग से उभरने वाले क्रॉस-साइट स्क्रिप्टिंग हमलों से सुरक्षित हूं।
आपके विचार क्या हैं? मुमकिन? असंभव? केवल मूर्खतापूर्ण?
संपादित करें: आर्मिन Ronacher एक बुरा जानकारी लीक यदि आप दुंदर चर पहुँच को फ़िल्टर नहीं करतीं की रूपरेखा, लेकिन प्रारूप() के रूप में संभव हासिल करने के संबंध में लगता है:
{local_foo.__init__.__globals__[secret_global]}
http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/
(व्यक्तिगत रूप से, मैं वास्तव में अपने उत्पाद में अविश्वसनीय प्रारूप() मार्ग नहीं चला था, लेकिन पूर्णता के लिए अद्यतन कर रहा हूं)
मूर्खतापूर्ण लगता है। क्या आप सिर्फ 'प्रतिस्थापन() 'का उपयोग नहीं कर सकते? – grc
ठीक है, एक प्रारंभिक प्रतिस्थापन के लिए() को प्रत्येक चर के लिए एक पास की आवश्यकता होती है जो स्ट्रिंग में हो सकती है, जो बहुत ही स्केल करेगा। –
लेम्मी उस दृश्य पर विस्तार करते हैं क्योंकि मुझे इसे संपादित करने का मौका याद आया। मेरा उपयोग मामला एक एमयूडी जैसी स्थिति है जहां मैं कई संभावित चर के साथ स्ट्रिंग स्वरूपण का एक टन करने जा रहा हूं। मैं स्ट्रिंग स्वरूपण के कमजोर रूप में 'string.emplate' जैसे वापस जा सकता हूं, लेकिन वस्तुओं के अंदर के क्षेत्रों को संदर्भित करने में सक्षम होने के कारण भी मेरे मामले में बहुत उपयोगी है। यह कुछ ऐसा है जो मैं हर कॉल में प्रत्येक तर्क से प्रत्येक फ़ील्ड का पैरामीटर मैप बनाकर अनुकरण कर सकता हूं, लेकिन यह बेहतर होगा कि कुछ बेहतर स्केल करने के लिए आश्वस्त हो। –