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