आप इतना सही कर रहे हैं कि मैं वास्तव में दोषी महसूस कर रहा हूं कि आप कुछ गलत कर रहे हैं! :)पी>
आप फ़ील्ड मानों को पैरामीटराइज़ करने के लिए केवल तैयार किए गए कथनों का उपयोग कर सकते हैं - न कि SQL पहचानकर्ता जैसे कि कॉलम या टेबल नाम। इसलिए आप A.x
. पास नहीं कर पाएंगे , B.z
आदि अपने JOIN
. में तैयार किए गए कथन मापदंडों के माध्यम से मानदंड:आपको जरूरी इसके बजाय वह करें जो बहुत गलत लगता है और उन्हें सीधे अपने SQL स्ट्रिंग में जोड़ दें।
वैसे, सबकुछ नष्ट नहीं हुआ है। वरीयता के कुछ अस्पष्ट क्रम में, आप यह कर सकते हैं:
-
उपयोगकर्ता को एक विकल्प सूची के साथ प्रस्तुत करें, जिससे आप बाद में SQL को फिर से इकट्ठा करते हैं:
<select name="join_a"> <option value="1">x</option> <option value="2">y</option> </select> <select name="join_b"> <option value="1">z</option> <option value="2">y</option> </select>
फिर आपका फॉर्म हैंडलर:
switch ($_POST['join_a']) { case 1: $acol = 'x'; break; case 2: $acol = 'y'; break; default: die('Invalid input'); } switch ($_POST['join_b']) { case 1: $bcol = 'z'; break; case 2: $bcol = 'y'; break; default: die('Invalid input'); } $sql .= "FROM A JOIN B ON A.$acol = B.$bcol";
इस दृष्टिकोण का लाभ यह है कि, PHP से समझौता करने से कम (जिस स्थिति में आपको SQL इंजेक्शन की तुलना में कहीं अधिक चिंता होगी), मनमानी SQL बिल्कुल नहीं अपने RDBMS में अपना रास्ता खोजें।
-
सुनिश्चित करें कि उपयोगकर्ता इनपुट अपेक्षित मानों में से एक से मेल खाता है:
<select name="join_a"> <option>x</option> <option>y</option> </select> <select name="join_b"> <option>z</option> <option>y</option> </select>
फिर आपका फॉर्म हैंडलर:
if (!in_array($_POST['join_a'], ['x', 'y']) or !in_array($_POST['join_b'], ['z', 'y'])) die('Invalid input'); $sql .= "FROM A JOIN B ON A.$_POST[join_a] = B.$_POST[join_b]";
यह दृष्टिकोण PHP के
in_array
. पर निर्भर करता है सुरक्षा के लिए कार्य करता है (और उपयोगकर्ता को आपके अंतर्निहित कॉलम नामों को भी उजागर करता है, लेकिन आपके आवेदन को देखते हुए मुझे संदेह है कि यह एक चिंता का विषय है)। -
कुछ इनपुट क्लींजिंग करें, जैसे:
mb_regex_encoding($charset); // charset of database connection $sql .= 'FROM A JOIN B ON A.`' . mb_ereg_replace('`', '``', $_POST['join_a']) . '`' . ' = B.`' . mb_ereg_replace('`', '``', $_POST['join_b']) . '`'
जबकि हम यहां उपयोगकर्ता इनपुट को उद्धृत करते हैं और उपयोगकर्ता द्वारा उस उद्धरण से बचने के किसी भी प्रयास को प्रतिस्थापित करते हैं, यह दृष्टिकोण सभी प्रकार की त्रुटियों और कमजोरियों से भरा हो सकता है (या तो PHP के
mb_ereg_replace
में) फ़ंक्शन या MySQL द्वारा उद्धृत पहचानकर्ता के भीतर विशेष रूप से तैयार किए गए स्ट्रिंग्स को संभालना)।यह दूर है उपयोगकर्ता द्वारा परिभाषित स्ट्रिंग्स को पूरी तरह से किसी के SQL में सम्मिलित करने से बचने के लिए उपरोक्त विधियों में से किसी एक का उपयोग करना बेहतर होगा।