Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Zend_Db वर्ग के साथ MySQL इंजेक्शन से बचना

जब मैं प्रोजेक्ट के लिए टीम लीड (संस्करण 1.0 तक) था, तब मैंने ज़ेंड फ्रेमवर्क में डेटाबेस पैरामीटर और उद्धरण के लिए बहुत सारे कोड लिखे थे।

जहां संभव हो मैंने सर्वोत्तम प्रथाओं को प्रोत्साहित करने की कोशिश की, लेकिन मुझे उपयोग में आसानी के साथ संतुलन बनाना पड़ा।

ध्यान दें कि आप हमेशा Zend_Db_Select . के स्ट्रिंग मान की जांच कर सकते हैं वस्तु, यह देखने के लिए कि उसने कैसे उद्धृत करने का निर्णय लिया है।

print $select; // invokes __toString() method

इसके अलावा आप Zend_Db_Profiler . का उपयोग कर सकते हैं Zend_Db . द्वारा आपकी ओर से चलाए जा रहे SQL का निरीक्षण करने के लिए ।

$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

आपके विशिष्ट प्रश्नों के कुछ उत्तर यहां दिए गए हैं:

  • Zend_Db_Select::where('last_name=?', $lname)

    मूल्यों को उचित रूप से उद्धृत किया गया है। हालांकि "? " एक पैरामीटर प्लेसहोल्डर की तरह दिखता है, इस पद्धति में तर्क वास्तव में उचित रूप से उद्धृत और प्रक्षेपित है। इसलिए यह एक वास्तविक क्वेरी पैरामीटर नहीं है। वास्तव में, निम्नलिखित दो कथन उपरोक्त उपयोग के समान ही क्वेरी उत्पन्न करते हैं:

    $select->where( $db->quoteInto('last_name=?', $lname) );
    $select->where( 'last_name=' . $db->quote($lname) );
    

    हालाँकि, यदि आप एक पैरामीटर पास करते हैं जो एक प्रकार की वस्तु है Zend_Db_Expr , तो यह उद्धृत नहीं है। आप SQL इंजेक्शन जोखिमों के लिए ज़िम्मेदार हैं, क्योंकि यह अभिव्यक्ति मानों का समर्थन करने के लिए शब्दशः प्रक्षेपित है:

    $select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
    

    उस अभिव्यक्ति का कोई अन्य भाग जिसे उद्धृत या सीमांकित करने की आवश्यकता है, वह आपकी जिम्मेदारी है। उदाहरण के लिए, यदि आप अभिव्यक्ति में किसी भी PHP चर को प्रक्षेपित करते हैं, तो सुरक्षा आपकी जिम्मेदारी है। यदि आपके पास कॉलम नाम हैं जो SQL कीवर्ड हैं, तो आपको उन्हें quoteIdentifier() के साथ स्वयं सीमित करना होगा . उदाहरण:

    $select->where($db->quoteIdentifier('order').'=?', $myVariable)
    
  • Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )

    जब तक आप AUTO_QUOTE_IDENTIFIERS को बंद नहीं करते, तब तक तालिका नाम और स्तंभ नाम सीमित कर दिए जाते हैं ।

    मानों को सही क्वेरी पैरामीटर के रूप में परिचालित किया जाता है (प्रक्षेपित नहीं)। जब तक मान Zend_Db_Expr न हो वस्तु, जिस स्थिति में यह शब्दशः प्रक्षेपित है, इसलिए आप भाव या NULL सम्मिलित कर सकते हैं या जो भी हो।

  • Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )

    जब तक आप AUTO_QUOTE_IDENTIFIERS को बंद नहीं करते, तब तक तालिका नाम और स्तंभ नाम सीमित कर दिए जाते हैं ।

    मानों को तब तक परिचालित किया जाता है, जब तक कि वे Zend_Db_Expr न हों ऑब्जेक्ट्स, जैसा कि insert() . में है विधि।

    $where तर्क बिल्कुल फ़िल्टर नहीं किया गया है, इसलिए आप उसमें किसी भी SQL इंजेक्शन जोखिम के लिए ज़िम्मेदार हैं। आप quoteInto() . का उपयोग कर सकते हैं उद्धरण को अधिक सुविधाजनक बनाने में मदद करने की विधि।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AWS RDS इंस्टेंस के लिए डेटाबेस टाइमज़ोन कैसे सेट करें?

  2. लार्वा अंतरिक्ष द्वारा अलग किए गए कई शब्दों की खोज करता है

  3. MYSQL उच्च LIMIT ऑफ़सेट क्वेरी को धीमा क्यों करता है?

  4. समूह गणना के प्रतिशत की गणना(*)

  5. तालिका बनाने में त्रुटि:आपको अपने SQL सिंटैक्स में 'ऑर्डर (order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id' लाइन 1 पर एक त्रुटि है)