दिलचस्प पोस्ट
क्या जावास्क्रिप्ट के माध्यम से एक लिंक (या किसी तत्व का) क्लिक करें ईवेंट को ट्रिगर करना संभव है? पायथन सेट बनाम सूचियां डिफ़ॉल्ट छवि गैलरी से चयनित चित्र की सही ओरिएंटेशन कैसे प्राप्त करें पीडीओ के साथ एक तैयार डालने के बाद आखिरी प्रविष्टि आईडी प्राप्त करें मैं jquery का उपयोग करके एक पेज रीफ्रेश कैसे खोज सकता हूं? कैसे जावास्क्रिप्ट का उपयोग कर एक HTML तत्व में एक विशेषता को जोड़ने / अपडेट करें? UITableViewCell की पृष्ठभूमि का रंग कैसे अनुकूलित करें? फ्लोट्स के लिए रेंज () यदि बयान काम नहीं कर रहा है? <Input type = "file"> का उपयोग करते समय फ़ाइल स्वरूप को सीमित करें? पीएचपी पढ़ने के लिए उप-निर्देशिकाएं और लूप कैसे करें? जब एक वर्ग को <> सूची से विरासत में मिली है, तो XmlSerializer अन्य विशेषताओं को क्रमबद्ध नहीं करता है कोणीय जेएस में एक प्रसारण घटना की सदस्यता त्यागें कैसे $ के माध्यम से पंजीकृत फ़ंक्शन को कैसे हटाया जाए Cython एक EXE करने के लिए संकलन कर सकते हैं? Java का SimpleDateFormat थ्रेड-सुरक्षित क्यों नहीं है?

Mysql_real_escape_string की कमियों?

मैंने यहां कुछ लोगों को देखा है कि mysql_real_escape_string का उपयोग करने वाली क्वेरी को mysql_real_escape_string से आप पूरी तरह से एसक्यूएल इंजेक्शन हमलों से नहीं बचा पाएंगे।

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

केवल उदाहरण मैं सोच सकता हूँ निम्नलिखित है:

 mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input)); 

यह आपको निम्न इनपुट से सुरक्षित नहीं करेगा:

 5 OR 1=1 

मैं इसे एक कमी के बजाय mysql_real_escape_string गलत उपयोग के रूप में देखता हूं, यह स्ट्रिंग्स के लिए डिज़ाइन नहीं किया गया है जो संख्यात्मक मान नहीं है। आपको या तो एक संख्यात्मक प्रकार में डालना चाहिए या यदि आप एक स्ट्रिंग के रूप में इनपुट का इलाज करने जा रहे हैं, तो आपको अपनी क्वेरी में ऐसा ही करना चाहिए और इसके चारों ओर उद्धरण चिह्न लगा देना चाहिए।

क्या कोई इनपुट का एक उदाहरण प्रदान कर सकता है जो mysql_real_escape_string आसपास हो सकता है जो अंकीय मानों के गलत संचालन पर भरोसा नहीं करता है या भूल सकता है कि mysql_query केवल एक क्वेरी निष्पादित कर सकता है?

संपादित करें: मैं mysql_real_escape_string की सीमाओं में दिलचस्पी ले रहा हूं और इसे विकल्प के साथ तुलना नहीं कर रहा हूं, मुझे पता है कि नई परियोजनाओं के लिए बेहतर विकल्प हैं और मैं उस पर विवाद नहीं कर रहा हूं।

वेब के समाधान से एकत्रित समाधान "Mysql_real_escape_string की कमियों?"

mysql_real_escape_string या सामान्य में mysql_ एक्सटेंशन की मुख्य कमी यह है कि अन्य, अधिक आधुनिक एपीआई, खासकर तैयार बयान से सही तरीके से लागू करना कठिन है। mysql_real_escape_string को एक ही मामले में उपयोग किया जाता है: पाठ सामग्री से बचने के लिए उद्धरण के बीच एक SQL कथन में एक मान के रूप में उपयोग किया जाता है उदाहरण के लिए:

 $value = mysql_real_escape_string($value, $link); $sql = "... `foo` = '$value' ..."; ^^^^^^ 

mysql_real_escape_string सुनिश्चित करता है कि उपरोक्त संदर्भ में $value एसक्यूएल वाक्यविन्यास को गड़बड़ नहीं करता है। यह काम नहीं करता जैसा आप यहां सोच सकते हैं:

 $sql = "... `foo` = $value ..."; 

या इधर:

 $sql = "... `$value` ..."; 

या इधर:

 $sql = mysql_real_escape_string("... `foo` = '$value' ..."); 

यदि उन मानों पर लागू किया जाता है जो एक SQL कथन में उद्धृत स्ट्रिंग के अलावा किसी भी संदर्भ में उपयोग किए जाते हैं, तो यह गलत ढंग से इस्तेमाल किया जाता है और परिणामी सिंटैक्स को गड़बड़ नहीं कर सकता है और / या किसी को ऐसे मान सबमिट करने की अनुमति दे सकती है जो एसक्यूएल इंजेक्शन हमलों को सक्षम कर सकते हैं। mysql_real_escape_string का उपयोग मामला बहुत संकीर्ण है, लेकिन शायद ही कभी इसे सही ढंग से समझा जा सकता है।

mysql_real_escape_string का उपयोग करते हुए अपने आप को गर्म पानी में लेने का एक अन्य तरीका है जब आप गलत तरीके से डेटाबेस कनेक्शन एन्कोडिंग सेट करते हैं। तुम्हें यह करना चाहिए:

 mysql_set_charset('utf8', $link); 

आप यह भी कर सकते हैं:

 mysql_query("SET NAMES 'utf8'", $link); 

समस्या यह है कि बाद में mysql_ एपीआई को छोड़कर, जो अभी भी सोचता है कि आप latin1 (या कुछ और) का उपयोग कर डेटाबेस से बात कर रहे हैं। अब mysql_real_escape_string का उपयोग करते समय, यह गलत वर्ण एन्कोडिंग मान लेगा और स्ट्रिंग्स को अलग से अलग करेगा क्योंकि डेटाबेस बाद में उन्हें व्याख्या करेगा। SET NAMES क्वेरी चला कर, आपने mysql_ ग्राहक एपीआई स्ट्रिंग का इलाज कर रहा है और डेटाबेस इन स्ट्रिंगों की व्याख्या कैसे करेगा, इसके बीच एक दरार बनाया है। इसका उपयोग कुछ मल्टीबाइट स्ट्रिंग स्थितियों में इंजेक्शन हमलों के लिए किया जा सकता है।

mysql_real_escape_string में कोई मौलिक इंजेक्शन कमजोरियों नहीं हैं जो मुझे पता है कि यह सही ढंग से लागू किया गया है। फिर भी, मुख्य समस्या यह है कि यह गलत तरीके से लागू करने के लिए बहुत ही भयानक आसान है, जो कमजोरियों को खोलता है।

ठीक है, इसलिए mysql_* अलावा नापसंद किया जा रहा है, मैं समझता हूं कि आप mysql_* किसी भी संभावित समाधान के बारे में जानना चाहते हैं। शायद यह ब्लॉग पोस्ट और स्लाइड उनमें से कुछ प्रकट हो सकती है
लेकिन जैसा कि इस पुराने प्रश्न से पता चलता है, ढलाई और उद्धरण पूर्ण प्रमाण नहीं है। सिर्फ इतनी सारी चीज़ें हैं जो गलत कर सकती हैं , और मर्फी का कानून, जो कि "कभी भी नेटवर्क पर भरोसा नहीं करते" , उस वैध मान से जुड़ गए, बहुत गलत हो जाएंगे।

शायद यह लेख , लेकिन सबसे महत्वपूर्ण बात, उस अनुच्छेद के अनुवर्ती और भी अधिक सुरक्षा मुद्दे प्रकट कर सकते हैं। ईमानदार होने के लिए, मुझे पता है mysql_real_escape_string पूरी तरह से नहीं है, यहां तक ​​कि कास्टिंग और स्ट्रिंग प्रारूपों के साथ संयोजन में भी:

 printf('WHERE id = \'%d\'',(int)mysql_real_escape_string($_REQUEST['id'])); 

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

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