सामान्य मामलों में बाध्य पैरामीटर का उपयोग करना पर्याप्त है, और SQL इंजेक्शन से बचने के लिए अच्छा अभ्यास है।
लेकिन तैयार किए गए कथन में एक पैरामीटर का उपयोग केवल मान . के लिए किया जा सकता है एक एसक्यूएल अभिव्यक्ति में। दूसरे शब्दों में, जहाँ आप सामान्य रूप से एक उद्धृत स्ट्रिंग शाब्दिक, उद्धृत तिथि शाब्दिक, या एक संख्यात्मक शाब्दिक लिखेंगे। और एक पैरामीटर ==एक मान (कोई सूची नहीं)।
आपको उन मामलों के लिए बाध्य पैरामीटर का उपयोग करना चाहिए। यदि आप यह प्रश्न इसलिए पूछ रहे हैं क्योंकि आपको लगता है कि यदि कोई व्यक्ति उत्तर देता है कि वे पर्याप्त नहीं हैं, तो आप बाध्य मापदंडों का उपयोग करना छोड़ सकते हैं, तो क्षमा करें, आपको सुरक्षित प्रोग्रामिंग प्रथाओं से छूट नहीं मिलेगी।
हालांकि, ऐसे अन्य (शायद कम आम) मामले हैं जिनके लिए बाध्य पैरामीटर काम नहीं करते हैं। यदि आपको डायनामिक टेबल नाम, कॉलम नाम, या अन्य पहचानकर्ता, या संपूर्ण अभिव्यक्ति, या SQL कीवर्ड के साथ एक क्वेरी लिखने की आवश्यकता है, तो आपको एक और विधि की आवश्यकता है। इन मामलों को SQL सिंटैक्स में तैयार . पर ठीक किया जाना चाहिए समय, इसलिए उन्हें पैरामीटर नहीं किया जा सकता है।
उदाहरण के लिए, यहां एक क्वेरी है जिसमें गतिशील भागों को चर के उपयोग द्वारा दर्शाया गया है, जो पैरामीटर नहीं हो सकते हैं:
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
आपको उन मामलों के लिए श्वेतसूची का उपयोग करना चाहिए . दूसरे शब्दों में, सुनिश्चित करें कि एक स्ट्रिंग जिसे आप अपनी क्वेरी में एक गतिशील तालिका नाम के रूप में प्रक्षेपित करते हैं, वास्तव में आपके डेटाबेस में मौजूद तालिकाओं में से एक है। सुनिश्चित करें कि SQL कीवर्ड वैध कीवर्ड हैं।
कभी नहीं उपयोगकर्ता इनपुट शब्दशः लें और इसे एसक्यूएल (या रनटाइम पर पार्स किया गया कोई अन्य कोड, जैसे तर्क आप eval()
को खिलाते हैं, में इंटरपोलेट करें। या shellexec()
) और यह केवल उपयोगकर्ता इनपुट नहीं है जो असुरक्षित सामग्री हो सकती है।
मेरी प्रस्तुति भी देखें SQL Injection Myths and Fallacies अधिक स्पष्टीकरण के लिए।