एसक्यूएल इंजेक्षन

यदि आप एक वेबपेज के माध्यम से एक उपयोगकर्ता इनपुट लेते हैं और इसे SQL डेटाबेस में डालते हैं, तो एक मौका है कि आपने सुरक्षा के मुद्दे के लिए खुद को व्यापक रूप से खुला छोड़ दिया है SQL Injection। यह अध्याय आपको सिखाएगा कि इसे होने से रोकने में मदद कैसे करें और अपने लिपियों और एसक्यूएल बयानों को अपने सर्वर साइड लिपियों जैसे कि पर्क स्क्रिप्ट में सुरक्षित करने में मदद करें।

इंजेक्शन आमतौर पर तब होता है जब आप किसी उपयोगकर्ता से इनपुट के लिए पूछते हैं, जैसे कि उनका नाम और नाम के बजाय वे आपको एक एसक्यूएल स्टेटमेंट देते हैं जिसे आप अनजाने में अपने डेटाबेस पर चलाएंगे। कभी भी विश्वास न करें कि उपयोगकर्ता ने डेटा प्रदान किया है, सत्यापन के बाद ही इस डेटा को संसाधित करें; एक नियम के रूप में, यह द्वारा किया जाता हैPattern Matching

नीचे दिए गए उदाहरण में, name अल्फ़ान्यूमेरिक वर्णों के साथ-साथ अंडरस्कोर और 8 और 20 वर्णों के बीच की लंबाई तक सीमित है (इन नियमों को आवश्यकतानुसार संशोधित करें)।

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
   $result = mysql_query("SELECT * FROM CUSTOMERS 
      WHERE name = $matches[0]");
} else {
   echo "user name not accepted";
}

समस्या को प्रदर्शित करने के लिए, इस अंश पर विचार करें -

// supposed input
$name = "Qadir'; DELETE FROM CUSTOMERS;";
mysql_query("SELECT * FROM CUSTOMSRS WHERE name='{$name}'");

फ़ंक्शन कॉल को CUSTOMERS तालिका से एक रिकॉर्ड प्राप्त करना है जहां नाम कॉलम उपयोगकर्ता द्वारा निर्दिष्ट नाम से मेल खाता है। सामान्य परिस्थितियों में,$nameकेवल अल्फ़ान्यूमेरिक वर्ण और शायद रिक्त स्थान शामिल होंगे, जैसे कि स्ट्रिंग इलिया। लेकिन यहां, $ नाम के लिए एक पूरी तरह से नई क्वेरी जोड़कर, डेटाबेस को कॉल आपदा में बदल जाता है; इंजेक्ट की गई DELETE क्वेरी कस्टमर टेबल से सभी रिकॉर्ड को हटा देती है।

सौभाग्य से, यदि आप MySQL का उपयोग करते हैं, तो mysql_query()फ़ंक्शन क्वेरी को किसी एकल फ़ंक्शन कॉल में कई SQL क्वेरी को स्टैकिंग या निष्पादित करने की अनुमति नहीं देता है। यदि आप क्वेरी को स्टैक करने का प्रयास करते हैं, तो कॉल विफल हो जाती है।

हालाँकि, अन्य PHP डेटाबेस एक्सटेंशन, जैसे SQLite तथा PostgreSQL खुशी से स्टैक्ड प्रश्नों को निष्पादित करें, एक स्ट्रिंग में प्रदान किए गए सभी प्रश्नों को निष्पादित करें और एक गंभीर सुरक्षा समस्या पैदा करें।

SQL इंजेक्शन को रोकना

आप पेरेल और PHP जैसी स्क्रिप्टिंग भाषाओं में स्मार्ट तरीके से सभी एस्केप पात्रों को संभाल सकते हैं। PHP के लिए MySQL एक्सटेंशन फ़ंक्शन प्रदान करता हैmysql_real_escape_string() इनपुट वर्णों से बचने के लिए जो MySQL के लिए विशेष हैं।

if (get_magic_quotes_gpc()) {
   $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");

LIKE Quandary

LIKE कंदरी को संबोधित करने के लिए, एक कस्टम एस्केपिंग मैकेनिज्म को यूज़र-सप्लाई किए गए '%' और '_' अक्षर को शाब्दिक रूप से परिवर्तित करना होगा। उपयोगaddcslashes(), एक फ़ंक्शन जो आपको बचने के लिए वर्ण सीमा निर्दिष्ट करने देता है।

$sub = addcslashes(mysql_real_escape_string("%str"), "%_");
// $sub == \%str\_
mysql_query("SELECT * FROM messages 
   WHERE subject LIKE '{$sub}%'");