2012-04-01 9 views
8

मैं एक परिवर्तनीय स्ट्रिंग शुरू कर रहा हूं और फिर इसे निम्नानुसार लॉगिंग कर रहा हूं।मेरी आईओएस एप्लिकेशन में मेरी स्ट्रिंग संभावित रूप से असुरक्षित क्यों है?

Format string is not a string literal (potentially insecure). 

क्यों:

NSMutableString* mStr = [[NSMutableString alloc] init]; 
mStr = (NSMutableString*) someTextFieldIbOutlet.text; 
NSLog((NSString *) mStr); 

कोड काम करता है और रन है, लेकिन मैं एक अजीब चेतावनी (पीले रंग में) मिल रहा है?

+0

प्रारूप कीड़े उत्पन्न होती हैं क्योंकि सी का तर्क पारित होने वाले सम्मेलन प्रकार-सुरक्षित नहीं होते हैं। –

उत्तर

10

ठीक है, वहाँ कुछ समस्याओं यहाँ हैं।

पहला (और जिसे आपने पूछा था) यह नहीं है कि आप एक नया एनएसएमयूटेबल स्ट्रिंग आवंटित कर रहे हैं और फिर इसे दूसरी पंक्ति में फेंक देते हैं जब आप इसे कुछTextFieldIbOutlet.text पर सेट करते हैं। इसके अलावा, आप एक म्यूटेबल करने के लिए एक गैर-परिवर्तनीय स्ट्रिंग कास्टिंग कर रहे हैं जो वास्तव में काम नहीं करेगा। इसके बजाय, इस तरह पहले दो लाइनों गठबंधन:

NSMutableString* mStr = [NSMutableString stringWithString:someTextFieldIbOutlet.text]; 

वास्तविक त्रुटि है कि आप हो रही है के कारण होता है क्योंकि NSLog के लिए पहला तर्क "प्रारूप" स्ट्रिंग जो NSLog बताता है कि कैसे आप स्वरूपित करना चाहते हैं माना जाता है डेटा जो बाद के तर्कों में आता है। यह एक शाब्दिक स्ट्रिंग होना चाहिए (@"this is a literal string" जैसा बनाया गया) ताकि इसका उपयोग आपके प्रोग्राम को इसमें बदलाव करके शोषण के लिए नहीं किया जा सके।

इसके बजाय, इस का उपयोग करें:

NSLog(@"%@", mStr); 

इस मामले में, प्रारूप स्ट्रिंग @"%@" जिसका अर्थ है "एक NSString वस्तु %@ करने के लिए सेट बनाएँ" है। %@ का अर्थ है कि अगला तर्क एक ऑब्जेक्ट है, और ऑब्जेक्ट के विवरण के साथ %@ को प्रतिस्थापित करने के लिए (जो इस मामले में स्ट्रिंग का मान है)।

+0

यह संभावित रूप से असुरक्षित क्यों है? – Claudiu

6

यदि mStr%@, NSLog जैसे किसी ऑब्जेक्ट तर्क को लोड करने का प्रयास करेगा, विफल हो सकता है, और शायद बुरी तरह दुर्घटनाग्रस्त हो जाएगा। अन्य प्रारूप तार भी हैं जो विनाश का कारण बन सकते हैं।

आप बस किसी भी मार्कर पाठ के बिना एक स्ट्रिंग लॉग इन करने की जरूरत है, का उपयोग करें:

NSLog(@"%@", mStr); 
6

mStr आप पास कर रहे हैं प्रारूपण के लिए उपयोग किया जाता है। यदि यह स्ट्रिंग अविश्वसनीय स्रोत से आती है, तो इसका उपयोग exploit your program पर किया जा सकता है यदि कोई हमलावर कुछ इनपुट प्रदान करता है जो सही ढंग से लिखा गया है।

आप अपने कोड को संशोधित करना चाहिए:

NSLog(@"%@", (NSString *) mStr); 

इस तरह, क्या सामग्री mStr में संग्रहित है कोई फर्क नहीं पड़ता है, यह अपने कार्यक्रम का दोहन करने के लिए किसी आक्रमणकर्ता द्वारा नहीं किया जा सकता।

यह एक गंभीर सुरक्षा समस्या है; CVE database के मेरे स्थानीय संग्रह से, मैंने 1 999 और 2012 के बीच प्रारूप स्ट्रिंग भेद्यता के 520 उदाहरणों की गणना की।

+0

@lnafziger: फिक्स के लिए धन्यवाद। – sarnold

+0

+1, विकिपीडिया यूआरएल के लिए धन्यवाद। –

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