तालिकाओं में शामिल होने पर, मैं Zend फ्रेमवर्क के SQL मॉडल का उपयोग करता हूं। उदाहरण के रूप में मैंने अपना वास्तविक कोड संशोधित किया है, लेकिन मुझे लगता है कि आपको बिंदु मिल जाएगा:
$this->getSelect()->join(
array('sections' => $sectionsTableName),
'main_table.banner_id = pages.banner_id',
array()
)
->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url)
->group('main_table.banner_id');
पृष्ठ को अजाक्स के साथ लोड किया गया है और $ अनुभाग पैरामीटर को जीईटी पैरामीटर ( www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
) के रूप में भेजा गया है ।
अब यहाँ समस्या है अगर कोई ऐसा कुछ करे:
www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
इस तरह से उपयोगकर्ता पूरे डेटाबेस को डंप कर सकता है। डेटा प्रदर्शित नहीं किया जाएगा, लेकिन फिर भी SQL डंप प्रदर्शन करेगा जो sql अधिभार का कारण बन सकता है।
प्रशन:
- ऐसे परिदृश्य को रोकने का सबसे अच्छा तरीका क्या है?
- अब मैं पिछले ग्राहकों के लिए चिंतित हूं। क्या इस कोड के साथ और भी अधिक जोखिम की कार्रवाई संभव है, जैसे कि विलंब या परिवर्तन तालिका? मुझे लगता है कि नहीं क्योंकि आप सबसेंट के अंदर SELECT के अलावा कोई अन्य स्टेटमेंट नहीं डाल सकते हैं, इसलिए DELETE sql सिंटैक्स त्रुटि उत्पन्न करेगा। क्या मैं सही हू?
अद्यतन: मेरा उदाहरण एसक्यूएल इंजेक्शन का उचित चित्रण नहीं है क्योंकि 'साइन ऑर्गन $ सेक्शन है और इस प्रकार इंजेक्शन बनाना संभव नहीं होगा। वैसे भी पूर्णांक मान की अपेक्षा करते समय यह संभव होगा और जब आप पूर्णांक इनपुट को फ़िल्टर नहीं करेंगे। मेरी टिप्पणी नीचे देखें।
'
साइन से पहले (
साइन होगा और इस प्रकार (SELECT
या कुछ भी सिर्फ स्ट्रिंग के रूप में होगा और फ़ंक्शन नहीं होगा। जब फ़ील्ड पूर्णांक होता है, तो '
उसकी आवश्यकता नहीं होती है और यह इस तरह के परिदृश्य को संभव बनाता है। लेकिन पूर्णांक को हमेशा फ़िल्टर किया जाना चाहिए intval()
ताकि यह भी समस्या न हो।
'
? तो ' AND (SELECT ...) '
? वैसे, मुझे नहीं लगता कि Zend इसे उद्धृत नहीं कर रहा है ... और यदि आप बाइंडिंग का उपयोग करते हैं, तो PDO इसे संभाल लेगा। बस कभी भी स्टिंग "sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
और$db->quote()
यहां तक कि आपके मामले में भी$db->quoteInto
। यदि$this
कोई संसाधन है, तो आप कर सकते हैं:$this->getConnection('core_read')->quoteInto()
यदि यह एक संग्रह है जो आप कर सकते हैं$this->getResource()->getConnection('core_read')->quoteInto()
:। उन पंक्तियों के साथ। यदि वह आपको अपने लक्ष्य की दिशा में मदद करता है।