किसी भी प्रश्न को इंजेक्ट किया जा सकता है चाहे वह पढ़ा या लिखा हो, लगातार या क्षणिक हो। इंजेक्शन एक क्वेरी को समाप्त करके और एक अलग एक चलाकर किया जा सकता है (mysqli
के साथ संभव है) ), जो इच्छित क्वेरी को अप्रासंगिक बना देता है।
किसी बाहरी स्रोत से किसी क्वेरी के लिए कोई इनपुट, चाहे वह उपयोगकर्ताओं से हो या आंतरिक भी, क्वेरी के लिए एक तर्क और क्वेरी के संदर्भ में एक पैरामीटर माना जाना चाहिए। किसी क्वेरी में किसी भी पैरामीटर को पैरामीटराइज़ करने की आवश्यकता होती है। यह एक उचित पैरामीटरयुक्त क्वेरी की ओर ले जाता है जिससे आप एक तैयार कथन बना सकते हैं और तर्कों के साथ निष्पादित कर सकते हैं। उदाहरण के लिए:
SELECT col1 FROM t1 WHERE col2 = ?
?
एक पैरामीटर के लिए प्लेसहोल्डर है। mysqli
का उपयोग करना , आप prepare
. का उपयोग करके एक तैयार विवरण बना सकते हैं , bind_param
. का उपयोग करके एक चर (तर्क) को एक पैरामीटर से बांधें , और क्वेरी को execute
. के साथ चलाएँ . आपको तर्क को बिल्कुल भी साफ करने की आवश्यकता नहीं है (वास्तव में ऐसा करना हानिकारक है)। mysqli
आपके लिए करता है। पूरी प्रक्रिया होगी:
$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();
पैरामीटरयुक्त क्वेरी . के बीच एक महत्वपूर्ण अंतर भी है और तैयार विवरण . यह कथन, तैयार होने पर, पैरामीटरयुक्त नहीं है और इस प्रकार इंजेक्शन के लिए असुरक्षित है:
$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
संक्षेप में:
- सभी प्रश्नों को ठीक से पैरामीटरयुक्त किया जाना चाहिए (जब तक कि उनके पास कोई पैरामीटर न हो)
- सभी किसी प्रश्न के तर्कों को यथासंभव शत्रुतापूर्ण माना जाना चाहिए, चाहे उनका स्रोत कुछ भी हो