2011-11-04 9 views
11

मैं एक कोडनिर्देशक अनुप्रयोग बना रहा हूं और मैं एसक्यूएल इंजेक्शन को रोकने के लिए अपनी सबसे कठिन कोशिश कर रहा हूं। मैं अपने सभी प्रश्नों को बनाने के लिए सक्रिय रिकॉर्ड विधि का उपयोग कर रहा हूं। मुझे पता है कि सक्रिय रिकॉर्ड स्वचालित रूप से इनपुट को स्वच्छ करता है, लेकिन मैं वास्तव में किस हद तक सोच रहा हूं? क्या यह बस सभी उद्धरणों से बचता है, या यह और अधिक करता है? Obfuscated एसक्यूएल इंजेक्शन, या अन्य उन्नत प्रकार को रोकने के बारे में क्या?कोडिनेटर इनपुट को कैसे नियंत्रित करता है?

असल में, मैं सीआई को डेटा को कैसे स्वच्छ करता है, इसकी गहराई से स्पष्टीकरण की तलाश में हूं। किसी को पता है?

+4

सीआई के कोड को देखने पर विचार किया है? – Beat

+0

बहुत सारी जानकारी: http://www.google.com.ng/search?gcx=c&sourceid=chrome&ie=UTF-8&q=codeigniter+sanitize+inputs%3F – Mob

+1

पीडीओ कोई भी? http://www.php.net/pdo –

उत्तर

9
इस तरह

वास्तव में (MySQL ड्राइवर के लिए):

  • प्रयास mysql_real_escape_string() (इस मामले समय के 99% हो जाएगा)
  • यहाँ अन्य CodeIgniter सुरक्षा मदों के लिए लिंक है
  • फॉल्स वापस mysql_escape_string()
  • फॉल्स के लिए वापस addslashes()
  • मैन्युअल निकल जाताकरने के लिए str_replace()

https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294

/** 
* Escape String 
* 
* @access public 
* @param string 
* @param bool whether or not the string will be used in a LIKE condition 
* @return string 
*/ 
function escape_str($str, $like = FALSE) 
{ 
    if (is_array($str)) 
    { 
     foreach ($str as $key => $val) 
     { 
      $str[$key] = $this->escape_str($val, $like); 
     } 

     return $str; 
    } 

    if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) 
    { 
     $str = mysql_real_escape_string($str, $this->conn_id); 
    } 
    elseif (function_exists('mysql_escape_string')) 
    { 
     $str = mysql_escape_string($str); 
    } 
    else 
    { 
     $str = addslashes($str); 
    } 

    // escape LIKE condition wildcards 
    if ($like === TRUE) 
    { 
     $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); 
    } 

    return $str; 
} 

ध्यान दें कि यह केवल पात्रों भागने है तो MySQL प्रश्नों को तोड़ने या कुछ अप्रत्याशित नहीं करेंगे, और एक डेटाबेस के संदर्भ में केवल प्रयोग किया जाता है के माध्यम सेऔर _ में LIKE की स्थिति आप जो भी पास करते हैं उसके आधार पर सही वाक्यविन्यास सुनिश्चित करने के लिए क्वेरी करें।

कोई जादू किसी भी संदर्भ (एचटीएमएल, CSV या XML उत्पादन की तरह), और सिर्फ मामले में आप इसके बारे में सोच रहे थे के लिए सुरक्षित सभी डेटा करता है कि नहीं है: xss_clean() एक एक आकार फिट सभी नहीं है समाधान और न ही यह 100% बुलेटप्रूफ है, कभी-कभी यह वास्तव में काफी अनुचित है। सक्रिय रिकॉर्ड क्लास स्वचालित रूप से बचने वाली क्वेरी करता है, लेकिन बाकी सब कुछ के लिए आपको दिए गए संदर्भ के सही तरीके से मैन्युअल रूप से डेटा को बचाना/स्वच्छ करना चाहिए, आउटपुट के साथ, इनपुट नहीं।

+0

मुझे पूरी तरह से यकीन नहीं है कि इनपुट के बजाय मेरे आउटपुट को स्वच्छ करके आप क्या मतलब रखते हैं। मुझे लगता है कि मैं समझता हूं कि अगर मैं एक्सएसएस हमलों को रोकने की कोशिश कर रहा हूं, लेकिन क्या होगा यदि मैं सक्रिय रिकॉर्ड क्लास का उपयोग कर एक MySQL क्वेरी बना रहा हूं? यह कैसा दिख सकता है? – Erreth

+0

एआर क्लास में जो कुछ भी आप फेंकते हैं वह आखिरकार 'mysql_real_escape_string' के रूप में सुरक्षित है, \ '' भागने \' 'तालिका और डेटाबेस नामों की अतिरिक्त सुरक्षा के साथ। आपको सुरक्षा के लिए इसे वैधता की आवश्यकता नहीं है, केवल वैधता के लिए (पूर्णांक मान, अधिकतम लंबाई, स्वरूपण, आदि)। Http://stackoverflow.com/questions/4171115/is-mysql-real-escape-string-enough-to-anti-sql-injection/4171134#4171134, http://stackoverflow.com/questions/5288953/is देखें -mysql-असली-एस्केप स्ट्रिंग-टूट –

1

आप last_query() विधि का उपयोग कर नवीनतम क्वेरी को हमेशा देख सकते हैं।

$this->db->last_query()

आप वास्तव में देखेंगे कैसे क्वेरी, देखा तो तुम अगर ठीक से स्वच्छ सत्यापित कर सकते हैं।

3

सक्रिय रिकॉर्ड केवल डेटा से बच निकलता है, और कुछ भी नहीं। एसक्यूएल इंजेक्शन से बचने से रोका गया है। फिर उनके सत्यापन वर्ग के साथ प्रपत्रों पर सत्यापन का उपयोग करें। अपने मुद्दों का ख्याल रखना चाहिए।

CodeIgniter UserGuide Security

+0

मैं समझता हूं। मैं फॉर्म सत्यापन वर्ग का थोड़ा सा उपयोग कर रहा हूं, लेकिन मुझे लगता है कि मुझे इसका इस्तेमाल हर रूप में करना चाहिए। मुझे निश्चित रूप से कुछ और आक्रामक स्वच्छता और सत्यापन करना होगा। धन्यवाद! – Erreth