विचार बहुत सरल है - क्वेरी और डेटा को अलग से डेटाबेस सर्वर पर भेजा जाता है ।
बस इतना ही।
SQL इंजेक्शन समस्या की जड़ कोड और डेटा के मिश्रण में है।
वास्तव में, हमारी SQL क्वेरी एक वैध कार्यक्रम है । और हम इस तरह के एक कार्यक्रम को गतिशील रूप से बना रहे हैं, मक्खी पर कुछ डेटा जोड़ रहे हैं। इस प्रकार, डेटा प्रोग्राम कोड में हस्तक्षेप कर सकता है और यहां तक कि इसे बदल भी सकता है, क्योंकि हर SQL इंजेक्शन उदाहरण इसे दिखाता है (सभी उदाहरण PHP / मैसूर में):
$expected_data = 1;
$query = "SELECT * FROM users where id=$expected_data";
एक नियमित क्वेरी का उत्पादन करेगा
SELECT * FROM users where id=1
इस कोड के दौरान
$spoiled_data = "1; DROP TABLE users;"
$query = "SELECT * FROM users where id=$spoiled_data";
एक दुर्भावनापूर्ण अनुक्रम का उत्पादन करेगा
SELECT * FROM users where id=1; DROP TABLE users;
यह काम करता है क्योंकि हम डेटा को सीधे प्रोग्राम बॉडी में जोड़ रहे हैं और यह प्रोग्राम का एक हिस्सा बन जाता है, इसलिए डेटा प्रोग्राम को बदल सकता है, और पास किए गए डेटा के आधार पर, हम या तो एक नियमित आउटपुट या एक टेबल users
हटा देंगे ।
जबकि तैयार बयानों के मामले में हम अपने कार्यक्रम में बदलाव नहीं करते हैं, यह बरकरार है
यही बात है।
हम पहले सर्वर को एक प्रोग्राम भेज रहे हैं
$db->prepare("SELECT * FROM users where id=?");
जहां डेटा को पैरामीटर या प्लेसहोल्डर नामक कुछ चर द्वारा प्रतिस्थापित किया जाता है।
ध्यान दें कि बिल्कुल उसी क्वेरी को सर्वर में भेजा जाता है, जिसमें कोई डेटा न हो! और फिर हम दूसरे अनुरोध के साथ डेटा भेज रहे हैं, अनिवार्य रूप से क्वेरी से ही अलग हो गए हैं:
$db->execute($data);
इसलिए यह हमारे कार्यक्रम को बदल नहीं सकता है और कोई नुकसान नहीं पहुंचा सकता है।
काफी आसान है - यह नहीं है?
केवल एक चीज मुझे जोड़ना है जो हमेशा हर मैनुअल में छोड़ी जाती है:
तैयार किए गए बयान केवल डेटा शाब्दिक सुरक्षा कर सकते हैं , लेकिन किसी अन्य क्वेरी भाग के साथ उपयोग नहीं किया जा सकता है।
इसलिए, एक बार जब हमें कहना होगा, एक डायनामिक आइडेंटिफ़ायर - एक फ़ील्ड नाम, उदाहरण के लिए - तैयार किए गए स्टेटमेंट हमारी मदद नहीं कर सकते हैं। मैंने हाल ही में इस मामले को समझाया है , इसलिए मैं खुद को नहीं दोहराऊंगा।