यह नहीं है एसक्यूएल इंजेक्शन क्या है। जब भी आप ऐसे पैरामीटर का उपयोग करते हैं जिन्हें आपकी SQL क्वेरी में सैनिटाइज नहीं किया गया है, तो आप अपने डेटाबेस को SQL इंजेक्शन के लिए खुला छोड़ देते हैं, जो जरूरी नहीं कि डेटा को नष्ट करने का लक्ष्य हो। यह डेटा चोरी करने या अनधिकृत पहुंच हासिल करने के लिए भी हो सकता है।
एक बहुत ही प्रतिबंधित खाते पर विचार करें जहां वह केवल SELECT
कर सकता है . आप प्रमाणीकरण के लिए एक प्रश्न लिखते हैं:
$sql = "SELECT COUNT(*) AS count
FROM users
WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
// check if returns a count of 1, if yes, log in
सामान्य इनपुट के साथ, आप क्वेरी के इस तरह दिखने की उम्मीद करते हैं:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
यदि उपयोगकर्ता नाम और पास दोनों मेल खाते हैं तो 1 को गिनती के रूप में वापस करना चाहिए। अब एक हमलावर व्यवस्थापक के रूप में लॉग इन करने का प्रयास करता है। चूंकि आपने अपने इनपुट को सैनिटाइज नहीं किया है, वे $_POST['user']
भेजते हैं के रूप में:admin'; --
. पूरी क्वेरी बन जाती है:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
--
. के बाद सब कुछ एक टिप्पणी है, इसलिए यह दूसरी शर्त पर ध्यान नहीं देता है और 1 की परवाह किए बिना लौटाता है। आप वहां जाएं, आपने अभी-अभी एक दुर्भावनापूर्ण उपयोगकर्ता व्यवस्थापक पहुंच प्रदान की है। इस तरह कुछ वास्तविक हमले किए जाते हैं। आप एक कम विशेषाधिकार प्राप्त खाते से शुरू करते हैं और सुरक्षा में छेद के माध्यम से आप अधिक विशेषाधिकारों तक पहुंच प्राप्त करने का प्रयास करते हैं।
लंबी कहानी छोटी, प्रतिबंधित विशेषाधिकारों के साथ एक एप्लिकेशन-व्यापी खाता होना (उदाहरण:कोई DROP
. नहीं , ALTER
आदि) अच्छा है। कभी भी किसी को या किसी एप्लिकेशन को जरूरत से ज्यादा विशेषाधिकार न दें। लेकिन SQL इंजेक्शन को रोकने के लिए तैयार स्टेटमेंट
का इस्तेमाल करें .