SQL Zend फ्रेमवर्क के SQL मॉडल का उपयोग करते समय कमजोरियों को इंजेक्शन करता है


15

तालिकाओं में शामिल होने पर, मैं 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&section=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 अधिभार का कारण बन सकता है।

प्रशन:

  1. ऐसे परिदृश्य को रोकने का सबसे अच्छा तरीका क्या है?
  2. अब मैं पिछले ग्राहकों के लिए चिंतित हूं। क्या इस कोड के साथ और भी अधिक जोखिम की कार्रवाई संभव है, जैसे कि विलंब या परिवर्तन तालिका? मुझे लगता है कि नहीं क्योंकि आप सबसेंट के अंदर SELECT के अलावा कोई अन्य स्टेटमेंट नहीं डाल सकते हैं, इसलिए DELETE sql सिंटैक्स त्रुटि उत्पन्न करेगा। क्या मैं सही हू?

अद्यतन: मेरा उदाहरण एसक्यूएल इंजेक्शन का उचित चित्रण नहीं है क्योंकि 'साइन ऑर्गन $ सेक्शन है और इस प्रकार इंजेक्शन बनाना संभव नहीं होगा। वैसे भी पूर्णांक मान की अपेक्षा करते समय यह संभव होगा और जब आप पूर्णांक इनपुट को फ़िल्टर नहीं करेंगे। मेरी टिप्पणी नीचे देखें।


1
आप उपयोग कर सकते हैं: $db = Mage::getSingleton('core/resource')->getConnection('core_read');और $db->quote()यहां तक ​​कि आपके मामले में भी $db->quoteInto। यदि $thisकोई संसाधन है, तो आप कर सकते हैं: $this->getConnection('core_read')->quoteInto()यदि यह एक संग्रह है जो आप कर सकते हैं $this->getResource()->getConnection('core_read')->quoteInto():। उन पंक्तियों के साथ। यदि वह आपको अपने लक्ष्य की दिशा में मदद करता है।
राख

मुझे बस एहसास हुआ कि यह परिदृश्य तभी संभव है जब मूल्य पूर्णांक है। यदि मान varchar है, तो हमेशा 'साइन से पहले (साइन होगा और इस प्रकार (SELECTया कुछ भी सिर्फ स्ट्रिंग के रूप में होगा और फ़ंक्शन नहीं होगा। जब फ़ील्ड पूर्णांक होता है, तो 'उसकी आवश्यकता नहीं होती है और यह इस तरह के परिदृश्य को संभव बनाता है। लेकिन पूर्णांक को हमेशा फ़िल्टर किया जाना चाहिए intval()ताकि यह भी समस्या न हो।
जॉनीफ्री

यदि आप समापन के साथ शुरू करते हैं तो क्या होगा '? तो ' AND (SELECT ...) '? वैसे, मुझे नहीं लगता कि Zend इसे उद्धृत नहीं कर रहा है ... और यदि आप बाइंडिंग का उपयोग करते हैं, तो PDO इसे संभाल लेगा। बस कभी भी स्टिंग "sections.section= '$section'"
कॉन्टेक्शंस का

@ 7ochem ऐसे मामले में आप पैरामीटर का उपयोग करना चाहते हैं? और 'बन जाएगा'। लेकिन अगर आप पूर्णांक मान का उपयोग करते हैं, तो आप इसे नहीं
बांधेंगे

जवाबों:


8

अपना इनपुट मान्य करें!

जितना अच्छा और जितना हो सके।

आपकी मान्यता के लिए कुछ सुझाव:

  1. GET- पैरामीटर के माध्यम से आपको प्राप्त होने वाले चर की लंबाई की जांच करें। एक लंबे समय तक स्ट्रिंग को स्वीकार करने की कोई आवश्यकता नहीं है।

  2. एक डोमेन नाम के लिए मान्य करें। आपके अपेक्षित डोमेन नाम में किस तरह का प्रारूप है? क्या यह हमेशा www.mydomain.tld है? एक मैच या एक (बेहतर) उपयोग के लिए जाँचता है कि एक regex बनाएँ Zend_Validate_Hostname:

    $validator = new Zend_Validate_Hostname();
    if ($validator->isValid($hostname)) {
        //hostname is valid - continue
    }
  3. श्वेतसूची: क्या आप जानते हैं कि कौन से डोमेन नाम की उम्मीद है? आप अनुमत डोमेन की एक सूची बना सकते हैं और उनके खिलाफ जांच कर सकते हैं। बाकी को गिरा दो।

    $allowedDomains = array('www.domain1.tld','www.domain2.tld');
  4. डोमेन नामों और वर्णों को ब्लैकलिस्ट करना: यदि आप एक डोमेन नाम की अपेक्षा करते हैं, तो az और 0-9 के अलावा किसी अन्य वर्ण को स्वीकार करने की कोई आवश्यकता नहीं है। " (जब तक आप विशेष डोमेन नामों के साथ काम नहीं कर रहे हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.