कड़ाई से बोलते हुए, वास्तव में कोई भागने की आवश्यकता नहीं है, क्योंकि पैरामीटर मान को क्वेरी स्ट्रिंग में कभी भी प्रक्षेपित नहीं किया जाता है।
क्वेरी पैरामीटर काम करने का तरीका यह है कि जब आप prepare()
कहते हैं तो क्वेरी डेटाबेस सर्वर को भेजी जाती है , और पैरामीटर मान बाद में भेजे जाते हैं, जब आप execute()
. कहते हैं . इसलिए उन्हें क्वेरी के टेक्स्ट फॉर्म से अलग रखा जाता है। SQL इंजेक्शन के लिए कोई अवसर नहीं है (बशर्ते PDO::ATTR_EMULATE_PREPARES
झूठा है)।
तो हाँ, क्वेरी पैरामीटर आपको उस प्रकार की सुरक्षा भेद्यता से बचने में मदद करते हैं।
क्या वे किसी भी सुरक्षा भेद्यता के खिलाफ 100% प्रमाण हैं? नही बिल्कुल नही। जैसा कि आप जानते हैं, एक क्वेरी पैरामीटर SQL अभिव्यक्ति में केवल एक शाब्दिक मान की जगह लेता है। आप मानों की सूची के लिए एकल पैरामीटर विकल्प नहीं बना सकते, उदाहरण के लिए:
SELECT * FROM blog WHERE userid IN ( ? );
आप तालिका नाम या स्तंभ नामों को गतिशील बनाने के लिए पैरामीटर का उपयोग नहीं कर सकते:
SELECT * FROM blog ORDER BY ?;
आप किसी अन्य प्रकार के SQL सिंटैक्स के लिए पैरामीटर का उपयोग नहीं कर सकते:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
तो ऐसे कुछ मामले हैं जहां आपको prepare()
से पहले क्वेरी को एक स्ट्रिंग के रूप में हेरफेर करना पड़ता है। बुलाना। इन मामलों में, आपको अभी भी SQL इंजेक्शन से बचने के लिए सावधानी से कोड लिखने की आवश्यकता है।