Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Mysql_real_escape_string की कमियां?

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

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

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

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

या यहाँ:

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

या यहाँ:

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

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

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

mysql_set_charset('utf8', $link);

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

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

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

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqli::mysqli():(HY000/2002):सॉकेट 'MySQL' के माध्यम से स्थानीय MySQL सर्वर से कनेक्ट नहीं हो सकता (2)

  2. MySQL में सेलेक्ट INTO और INSERT INTO के बीच अंतर

  3. पीडीओ ::परम टाइप दशमलव के लिए?

  4. MySQL में दो टेबल्स की तुलना कैसे करें

  5. PHP कोड के भीतर से एक MySQL संग्रहीत प्रक्रिया को कैसे कॉल करें?