एक SQL इंजेक्शन एक दुर्भावनापूर्ण रूप से बनाई गई SQL क्वेरी है जिसका उपयोग SQL डेटाबेस को कुछ ऐसा देने में "भ्रमित" करने के लिए किया जाता है जो इसे नहीं करना चाहिए। उदाहरण के लिए, निम्नलिखित प्रश्न पर विचार करें
"SELECT * FROM `users` WHERE `username` = '$name'";
एक सामान्य मामले में, यह काम करेगा। अगर हम इसमें 'जैक' सबमिट करते हैं, तो यह जैक नाम के सभी यूजर्स को वापस कर देगा। हालांकि, यदि कोई उपयोगकर्ता प्रवेश करता है, तो "'या 1=1" कहें, परिणामी क्वेरी होगी
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";
चूंकि 1 हमेशा 1 के बराबर होता है, और संयोजन खंड OR है, यह प्रत्येक पंक्ति पर सत्य लौटेगा, जो बदले में प्रत्येक पंक्ति को दुर्भावनापूर्ण उपयोगकर्ता को प्रदर्शित करेगा। इस तकनीक का उपयोग करके कोई आपके पूरे डेटाबेस को देख सकता है। यह भी विचार करें कि क्या कोई "'; ड्रॉप टेबल users
. जैसा कुछ सबमिट करता है ";--, जिसके परिणामस्वरूप
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";
जो दो प्रश्न हैं, एक जो कुछ नहीं करेगा, दूसरा जो ENTIRE उपयोगकर्ता डेटाबेस को हटा देगा, जिसके परिणामस्वरूप आपका डेटा नष्ट हो जाएगा।
एसक्यूएल इंजेक्शन को रोकने का सबसे अच्छा तरीका तैयार बयानों का उपयोग करना है। इनके साथ, आप SQL डेटाबेस को एक क्वेरी भेजते हैं जो कुछ इस तरह कहती है
"SELECT * FROM `users` WHERE `username` = '?'";
यह डेटाबेस को क्वेरी के प्रारूप को जानने देता है (जहां उपयोगकर्ता नाम कुछ मूल्य के बराबर होता है), इसलिए सादा पाठ क्वेरी दिए जाने पर कोई भ्रम नहीं होता है। तब डेटाबेस एक मान की अपेक्षा करना जानता है, और इसे कहां रखना है। फिर आप उस मान को डेटाबेस में पास करते हैं जिसका उपयोग वह खोज करने के लिए कर सकता है। यह भी बेहतर है क्योंकि डेटाबेस तेजी से खोज के लिए क्वेरी को अनुकूलित कर सकता है।
तैयार किए गए बयानों को पढ़ें, जो इसे और विस्तार से बताएंगे।