मुझे विश्वास है कि:
$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");
$idValue
. के मूल्यों के साथ आसानी से समझौता किया जा सकता है जो '
. को बंद करते हैं और फिर अतिरिक्त कमांड जोड़ें, जैसे
$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";
जबकि मुझे एहसास है कि आप कहते हैं कि कई बयान अक्षम हैं, कुछ ऐसा जो भयानक नहीं है, तालिका में डेटा को सीधे संपादित करने के बजाय अनधिकृत डेटा वापस करना होगा, जैसे:
$idValue = "z' OR name IS NOT NULL OR name = 'x";
जबकि MySQLi के साथ संभावना . है दृष्टिकोण का उपयोग prepared statements
. के साथ किया जा सकता है , जो चर को उसकी स्थिति से बाहर केवल एक चर के रूप में कार्य करने से रोकेगा। जैसे:
mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();
bind_param
. के बारे में मेरी समझ यह है कि चर में सभी MySQL कीवर्ड और मुख्य वर्ण बच गए होंगे जिससे सुरक्षा उल्लंघन और अनधिकृत पंक्तियों की वापसी को रोका जा सकेगा।
यह एक विकल्प है जो MySQL के पास नहीं है . तैयार कथन सुधार . में सहायता करते हैं इंजेक्शन सुरक्षा लेकिन वे रोक नहीं देंगे अकेले इंजेक्शन हमले, लेकिन प्रोग्रामर द्वारा व्यापक रणनीति के हिस्से के रूप में अधिक का उपयोग किया जाना चाहिए।
जिस तरह बॉडी आर्मर पहनने से आप अजेय नहीं बन जाते, बल्कि इससे आपके बचने की संभावना काफी बढ़ जाती है। MySQLi एक जादू की गोली नहीं है, और न ही पीडीओ है, लेकिन वे समग्र रूप से सुरक्षा स्तरों में सुधार करेंगे।
MySQL को भी बहिष्कृत कर दिया गया है और जैसा कि क्रिस्टोफर ने कहा है, अब इसे बनाए नहीं रखा जा रहा है इसका मतलब है कि इसके साथ छिद्रों और समस्याओं की संख्या केवल बढ़ेगी क्योंकि अन्य तकनीकों का विकास जारी रहेगा।
सारांश
अगर आप MySQLi . लिखते हैं उसी तरह जैसे आपने MySQL स्टेटमेंट लिखे हैं, तो आपको इंजेक्शन से कोई अतिरिक्त सुरक्षा नहीं मिलेगी। हालाँकि, MySQLi तैयार विवरण प्रदान करता है दृष्टिकोण जो SQL इंजेक्शन के खिलाफ सुरक्षा को महत्वपूर्ण रूप से बढ़ाता है, लेकिन अंतर्निहित डेटाबेस इंटरफ़ेस का परिवर्तन अपने आप में आपको कोई अंतर्निहित लाभ या सुरक्षा नहीं देता है जब तक कि आप तैयार किए गए कथनों का उपयोग करके इन्हें अपने आप में कोड करने के लिए नहीं चुनते हैं ।