flawopen.com/SQL Injection/पैरामीटराइज़्ड क्वेरी क्या है?
आसान भाषा में, पैरामीटराइज़्ड क्वेरी क्या है?
लेबल वाले खाली स्थानों वाला फ़ॉर्म सोचें: प्रोग्राम निर्देशों को स्थिर रखता है और डेटाबेस लाइब्रेरी से हर मान को उसके संबंधित स्थान में रखने को कहता है। लाइब्रेरी सर्वर पर native तैयारी कर सकती है या क्लाइंट पर उसका अनुकरण कर सकती है, लेकिन एप्लिकेशन कोड को उपयोगकर्ता इनपुट से निर्देश नहीं बदलने चाहिए।
तंत्र
सर्वर पर native prepared statement में ड्राइवर placeholder वाले SQL को तैयार करता है और निष्पादन के समय बँधे हुए मान देता है। प्रोटोकॉल और क्रम डेटाबेस तथा ड्राइवर पर निर्भर करते हैं। कुछ ड्राइवर क्लाइंट पर तैयारी का अनुकरण कर सकते हैं; PDO इस मोड को स्पष्ट रूप से दस्तावेज़ करता है। इसलिए केवल API कॉल से यह पता नहीं चलता कि मान कैसे भेजा जाता है। SQL संरचना स्थिर रखें, ड्राइवर की दस्तावेज़ीकृत binding API इस्तेमाल करें और जाँचें कि native या emulated मोड सक्रिय है।
यह केवल "सावधानी से एस्केप करने" से अलग क्यों है
Manual escaping में एप्लिकेशन कोड को मान जोड़ने से पहले सही ढंग से encode करना पड़ता है; यह नाज़ुक और संदर्भ पर निर्भर है। Parameter-binding API मानों का प्रबंधन ड्राइवर को सौंपती है। Server-side native तैयारी में मान अलग protocol parameters के रूप में जाते हैं; emulation में ड्राइवर क्लाइंट पर placeholders संसाधित करता है। उपयोगकर्ता इनपुट को एप्लिकेशन द्वारा बनाए गए SQL strings में न जोड़ें और ड्राइवर के दस्तावेज़ीकृत binding व्यवहार की पुष्टि करें।
FAQ
बहुत निकट से संबंधित — prepared statement वह डेटाबेस-पक्ष वस्तु है जो तयशुदा क्वेरी-संरचना से बनती है; पैरामीटराइज़ेशन उससे मानों को अलग से बाँधने की पद्धति है। ये शब्द अक्सर एक-दूसरे के लिए इस्तेमाल होते हैं।
केवल मानों (डेटा) के लिए, टेबल या कॉलम नाम जैसे पहचानकर्ताओं के लिए नहीं — उनके लिए अलग बचाव चाहिए, आमतौर पर एक अनुमति-सूची।
संदर्भ
- OWASP SQL इंजेक्शन रोकथाम चीट शीट
- flawopen.com — SQL इंजेक्शन (सभी भाषाएँ)
- PHP Manual — PDO::ATTR_EMULATE_PREPARES
- MySQL Reference — COM_STMT_PREPARE
- MySQL Reference — COM_STMT_EXECUTE