2009-07-06 7 views
13

मैं MySQL एपीआई समारोह(एम) एसक्यूएल इंजेक्शन को रोकने के लिए कौन से पात्रों से बच निकलना है?

mysql_real_escape_string() 

प्रलेखन के आधार पर उपयोग कर रहा हूँ, यह निम्न वर्णों निकल जाता है:

\0 
\n 
\r 
\ 
' 
" 
\Z 

अब, मैं OWASP.org के ESAPI सुरक्षा पुस्तकालय में और अजगर बंदरगाह में देखा यह निम्नलिखित कोड (http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql.py) था:

 """ 
     Encodes a character for MySQL. 
     """ 
     lookup = { 
     0x00 : "\\0", 
     0x08 : "\\b", 
     0x09 : "\\t", 
     0x0a : "\\n", 
     0x0d : "\\r", 
     0x1a : "\\Z", 
     0x22 : '\\"', 
     0x25 : "\\%", 
     0x27 : "\\'", 
     0x5c : "\\\\", 
     0x5f : "\\_", 
     } 

अब, मैं सोच रहा हूँ कि क्या उन सभी पात्रों वास्तव में तों होने की जरूरत है caped। मैं समझता हूं कि% और _ क्यों हैं, वे LIKE ऑपरेटर में मेटा वर्ण हैं, लेकिन मैं समझ नहीं पा रहा हूं कि उन्होंने बैकस्पेस और टैबलेट वर्ण (\ b \ t) क्यों जोड़ा? अगर आप एक प्रश्न करना वहाँ एक सुरक्षा मुद्दा है:

SELECT a FROM b WHERE c = '...user input ...'; 

कहाँ उपयोगकर्ता इनपुट tabulators या बैकस्पेस वर्ण हैं?

मेरा प्रश्न यहां है: उन्होंने ESAPI सुरक्षा पुस्तकालय में \ b \ t क्यों शामिल किया? क्या कोई स्थितियां हैं जहां आपको उन पात्रों से बचने की आवश्यकता हो सकती है?

+0

मैं एक अजगर व्यक्ति या ने MySQL व्यक्ति नहीं हूँ, लेकिन मेरी पहली हालांकि इस के लिए इकाई परीक्षण देखने के लिए था, दुर्भाग्य से उन्होंने ऐसा नहीं किया कुछ भी उपयोगी बताएं- http://code.google.com/p/owasp-esapi-python/source/browse/esapi/test/codecs/test_mysql.py – RichardOD

उत्तर

14

MySQL manual page for strings का कहना है:

  • \0 एक ASCII NUL (0x00) चरित्र।
  • \' एक एकल उद्धरण ("'") चरित्र।
  • \" एक डबल कोट (""") चरित्र।
  • \b एक बैकस्पेस चरित्र।
  • \n एक नई लाइन (लाइनफीड) चरित्र।
  • \r एक कैरिज रिटर्न कैरेक्टर।
  • \t एक टैब वर्ण।
  • \Z ASCII 26 (नियंत्रण-जेड)। तालिका के बाद नोट देखें।
  • \\ एक बैकस्लैश ("\") चरित्र।
  • \% ए "%" वर्ण। तालिका के बाद नोट देखें।
  • \_ ए "_" चरित्र। तालिका के बाद नोट देखें।
+0

इसे मृत लिंक करें। अद्यतन करने पर विचार करें। –

+0

एफवाईआई, लिंक काम कर रहा है। –

38

बैकस्पेस चरित्र के विषय में एक अनुमान: कल्पना कीजिए मैं आपको एक ईमेल भेजने के लिए और

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6); 

आप बिल्ली फ़ाइल के साथ एक संलग्न textfile "हाय, यहाँ डीबी अद्यतन करने के लिए के रूप में आप चाहते थे क्वेरी है", देखना यह है ठीक है, और बस फ़ाइल को MySQL पर पाइप करें। आप नहीं पता था कि क्या, तथापि, कि मैं सम्मिलित वक्तव्य जो आप क्योंकि सांत्वना उत्पादन पर backspaces यह ओवरराइट कर नहीं देखा से पहले

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b 

डाला गया था। Bamm!

हालांकि, अनुमान है।

संपादित करें (का विरोध नहीं कर सकता है): अगर आप किसी भी अन्य विकल्प हैं

alt text

+12

+1 मेरे पसंदीदा एक्सकेसीडी कॉमिक –

+1

के संदर्भ के लिए +1 यह ' इस तरह मूल http://xkcd.com/327/ –

+3

धन्यवाद स्टीफानो, जो सीसी लाइसेंस के एट्रिब्यूशन क्लॉज को पूरा करता है। – balpha

4

ब्लैकलिस्टिंग (बुरा पात्रों की पहचान) जाने का रास्ता नहीं है,।

आपको श्वेतसूची के संयोजन का उपयोग करने की आवश्यकता है, और अधिक महत्वपूर्ण बात यह है कि बाध्य-पैरामीटर दृष्टिकोण।

जबकि इस विशेष उत्तर में एक PHP फोकस है, यह अभी भी बहुत मदद करता है और यह समझाने में मदद करेगा कि एक चार फ़िल्टर के माध्यम से केवल एक स्ट्रिंग चलाने से कई मामलों में काम नहीं होता है। कृपया, कृपया देखें Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

0

जहां उपयोगकर्ता इनपुट में टैबलेटर्स या बैकस्पेस वर्ण होते हैं?

यह काफी उल्लेखनीय एक तथ्य यह है कि इस दिन के लिए ऊपर अधिकांश उपयोगकर्ताओं को विश्वास है कि यह उपयोगकर्ता इनपुट भाग निकले जा करने के लिए किया है, और इस तरह से बचने "इंजेक्शन से बचाता है।"

-2

कोई भी उपयोगकर्ता इनपुट से एकल कोट (ओं) को हटा नहीं सकता है?

जैसे: $input =~ s/\'|\"//g;

+0

यह नहीं पता कि यह एक अच्छा विचार है –

+0

यदि आप O'Leary जैसे नाम को स्टोर करने का प्रयास कर रहे हैं, तो आप व्यक्ति के नाम को गड़बड़ कर देंगे। यदि आप '"सहायता!' जैसी वाक्य संग्रहित कर रहे हैं, तो डेविड चिल्लाया। 'आप डबल-कोट्स रखना चाहते हैं। तो हाँ, कुछ मामलों में विशेष पात्रों को डंप करना ठीक हो सकता है, लेकिन बिलकुल नहीं। – Bing

0

जावा समाधान:

public static String filter(String s) { 
    StringBuffer buffer = new StringBuffer(); 
    int i; 

    for(byte b : s.getBytes()) { 
     i = (int) b; 

     switch(i) { 
      case 9 : buffer.append(" "); break; 
      case 10 : buffer.append("\\n" ); break; 
      case 13 : buffer.append("\\r" ); break; 
      case 34 : buffer.append("\\\""); break; 
      case 39 : buffer.append("\\'" ); break; 
      case 92 : buffer.append("\\" ); 

      if(i > 31 && i < 127) buffer.append(new String(new byte[] { b })); 
     } 
    } 

    return buffer.toString(); 
} 
+0

वास्तविक प्रश्न ** "जावा" ** (टैग देखें) के बारे में नहीं है ... – Axel

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