2011-10-12 10 views
35

क्या माइस्क्लुएल स्ट्रिंग को MySQL के लिए अनुकूल नोडजेएस को पास करने के लिए दूर है? मैं अपने नोडजेएस सर्वर पर एक ईमेल पता पास करने और MySQL डेटाबेस में क्वेरी करने की कोशिश कर रहा हूं। उपयोगकर्ता नाम जैसे नियमित पाठ करते समय ठीक काम करता है, लेकिन ईमेल पता नहीं करता है। बचने का स्पष्ट रूप से सही जवाब नहीं है क्योंकि यह एसक्यूएल सम्मिलन के लिए नहीं है। मुझे लगता है कि मुझे PHP फ़ंक्शन mysql_real_escape_string() की लाइनों पर कुछ चाहिए।जावास्क्रिप्ट स्ट्रिंग एसक्यूएल दोस्ताना बनाना

+0

आप आप एक डालने समारोह – Raynos

+0

मैं कर रहा हूँ करने के लिए कुंजी/मान जोड़े में पारित करने के लिए अनुमति देता है कि एक उचित mysql पुस्तकालय की तर्ज पर इनपुट और फिर कुछ प्रतिबंध लगाया की तर्ज पर कुछ चाहिए NodeJS MySQL लाइब्रेरी का उपयोग करके जो ठीक काम करता है। मैं इसे ठीक से कैसे व्यवस्थित करूं? – Bobby

+0

उस पर एक ईमेल regexp चलाएं, अगर यह क्लाइंट को एक त्रुटि संदेश वापस विफल करने में विफल रहता है। – Raynos

उत्तर

44

यह पता चला है कि mysql_real_escape_string() बहुत छोटा है। According to the documentation:

mysql_real_escape_string() कॉल MySQL के पुस्तकालय समारोह mysql_real_escape_string है, जो निम्न वर्णों को बैकस्लैश पहले जोड़ता: \ x00, \ N, \ r \ ', "और \ x1a

बहुत सरल है, वास्तव में लगता है आप कुछ इस तरह कर सकता है:।

function mysql_real_escape_string (str) { 
    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) { 
     switch (char) { 
      case "\0": 
       return "\\0"; 
      case "\x08": 
       return "\\b"; 
      case "\x09": 
       return "\\t"; 
      case "\x1a": 
       return "\\z"; 
      case "\n": 
       return "\\n"; 
      case "\r": 
       return "\\r"; 
      case "\"": 
      case "'": 
      case "\\": 
      case "%": 
       return "\\"+char; // prepends a backslash to backslash, percent, 
            // and double/single quotes 
     } 
    }); 
} 

नोट: मैं यह किसी भी रों के माध्यम से नहीं चला है यूनिट टेस्ट या सुरक्षा परीक्षण का ऑर्ट, लेकिन ऐसा लगता है कि - और एक अतिरिक्त बोनस के रूप में, यह टैब, बैकस्पेस और '%' से बच निकलता है, इसलिए इसे OWASP's recommendations के अनुसार, LIKE क्वेरीज़ में भी उपयोग किया जा सकता है (विपरीत PHP मूल)।

मुझे पता है कि mysql_real_escape_string() चरित्र-सेट-जागरूक है, लेकिन मुझे यकीन नहीं है कि कौन सा लाभ जोड़ता है।

इन मुद्दों की एक अच्छी चर्चा over here है।

+0

यह बहुत बढ़िया @ पॉल है जो वास्तव में काम करता है। – Bobby

+0

@ बॉबी वैसे मैं आपके जैसा आश्चर्यचकित हूं! मुझे उम्मीद है कि यह सभी स्थितियों में सुरक्षित है :-) –

+1

@ बॉबी इमोजी को न भूलें जो त्रुटि को ट्रिगर कर सकता है। 'var m = m.replace (/ ([\ uE000- \ uF8FF] | \ uD83C [\ uDF00- \ uDFFF] | \ uD83D [\ uDC00- \ uDDFF])/g,' ');' जोड़ा जा सकता है – zipp

8

मामले में किसी को इस प्रकार CUBRID RDBMS कार्यों में की तलाश में है, escapeString():

var _escapeString = function (val) { 
    val = val.replace(/[\0\n\r\b\t\\'"\x1a]/g, function (s) { 
    switch (s) { 
     case "\0": 
     return "\\0"; 
     case "\n": 
     return "\\n"; 
     case "\r": 
     return "\\r"; 
     case "\b": 
     return "\\b"; 
     case "\t": 
     return "\\t"; 
     case "\x1a": 
     return "\\Z"; 
     case "'": 
     return "''"; 
     case '"': 
     return '""'; 
     default: 
     return "\\" + s; 
    } 
    }); 

    return val; 
}; 

यह CUBRID Node.js driver से एक अंश है।

0

आप इस तरह के रूप CJK पात्रों http://en.wikipedia.org/wiki/CJK_characters या iOS/एंड्रॉयड/अन्य मोबाइल फोन के कुछ विशेष भावनात्मक माउस के साथ खेल रहे हैं, तो ... "‡ ‰ ™ ©" या decodeURIComponent ("\ xF3 xBE \ xAD \ xA0 \") ।

आप एक मामले बयान के बजाय सरणियों का उपयोग करते हुए इस

[client] 
default-character-set = utf8mb4 

[mysqld] 
character-set-server = utf8mb4 
skip-character-set-client-handshake 
4

की तरह अपने my.cnf स्थापित करने के लिए की आवश्यकता होगी:

var regex = new RegExp(/[\0\x08\x09\x1a\n\r"'\\\%]/g) 
var escaper = function escaper(char){ 
    var m = ['\\0', '\\x08', '\\x09', '\\x1a', '\\n', '\\r', "'", '"', "\\", '\\\\', "%"]; 
    var r = ['\\\\0', '\\\\b', '\\\\t', '\\\\z', '\\\\n', '\\\\r', "''", '""', '\\\\', '\\\\\\\\', '\\%']; 
    return r[m.indexOf(char)]; 
}; 

//Implementation 
"Some Crazy String that Needs Escaping".replace(regex, escaper); 
+2

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

+1

केस स्टेटमेंट्स का एक और सेट लिखने के बजाय दूसरी तरफ जाने की स्थिति में दोनों को स्वैप करना आसान है। मेरी राय में यह और अधिक कार्यात्मक और अधिक है जावास्क्रिप्ट की भावना। सबसे अधिक संभावना पर काफी सुधार किया जा सकता है। – Justin

5

कठिन रास्ता है कि इस समारोह के लिए संख्या गुजर पूरे का कारण बनता है सीखा प्रक्रिया का उपयोग चुपचाप मरने के लिए किया जाता है। तो मैं एक छोटे से परीक्षण जोड़ें:

function mysql_real_escape_string (str) { 
    if (typeof str != 'string') 
     return str; 

    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) { 
     switch (char) { 
      case "\0": 
       return "\\0"; 
      case "\x08": 
       return "\\b"; 
      case "\x09": 
       return "\\t"; 
      case "\x1a": 
       return "\\z"; 
      case "\n": 
       return "\\n"; 
      case "\r": 
       return "\\r"; 
      case "\"": 
      case "'": 
      case "\\": 
      case "%": 
       return "\\"+char; // prepends a backslash to backslash, percent, 
            // and double/single quotes 
     } 
    }); 
} 
+0

यह वास्तव में अच्छा है स्वीकार्य उत्तर के अलावा। धन्यवाद। – Dave

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