2010-08-18 11 views
8

के खिलाफ सुरक्षा कैसे करें हम एक ऐसे अनुप्रयोग का निर्माण कर रहे हैं जो एलडीएपी का उपयोग php के माध्यम से करता है और मुझे लगता है कि आप एलडीएपी में इंजेक्शन के साथ कुछ भी कर सकते हैं और बेहतर है कि एलडीएपी इंजेक्शन के खिलाफ कोई सुरक्षा कैसे करता है?एलडीएपी इंजेक्शन

उत्तर

9

जब LDAP फिल्टर का निर्माण आपके द्वारा फ़िल्टर मूल्यों RFC2254 के अनुसार नियंत्रित किया जाता है यह सुनिश्चित करना चाहिए:

LDAP फिल्टर में एक ACII कोड < 32 के साथ ही पात्रों विशेष अर्थ के साथ साथ किसी भी नियंत्रण वर्ण " * "," (",") ", और" \ "(बैकस्लैश) को बैकस्लैश के के प्रतिनिधित्व में परिवर्तित किया गया है, इसके बाद दो हेक्स वर्ण हेक्साडेसिमल वर्ण के मान का प्रतिनिधित्व करते हैं।

उदाहरण के लिए Zend_Ldap निम्नलिखित दिनचर्या

//[...] 
$val = str_replace(array('\\', '*', '(', ')'), array('\5c', '\2a', '\28', '\29'), $val); 
for ($i = 0; $i<strlen($val); $i++) { 
    $char = substr($val, $i, 1); 
    if (ord($char)<32) { 
     $hex = dechex(ord($char)); 
     if (strlen($hex) == 1) $hex = '0' . $hex; 
     $val = str_replace($char, '\\' . $hex, $val); 
    } 
} 
//[...] 
+1

मैं पासवर्ड को कैसे स्वच्छ कर दूंगा, क्योंकि उन विशेष पात्रों की अनुमति है? – Bastien974

+0

यह वही है जो उपर्युक्त कोड करता है ... यह विशेष वर्ण बदलता है और उन्हें एन्कोड करता है। यह यूआरएल की तरह है, कल्पना करें कि किसी ने पैरामीटर में रखा है, तो आप इसे कन्वर्ट करते हैं।सिर्फ इसलिए कि ब्राउज़र/ldap पासवर्ड स्मार्ट है और आपके लिए इस त्रुटि को ठीक करने का प्रयास करता है, इसका मतलब यह नहीं है कि विशेष वर्ण भेजने के लिए अभी भी ठीक है। – TravisO

+0

इस समाधान का प्रयास किया और यह ठीक से काम नहीं करता है। इसे हेक्स अक्षरों के सरणी को स्वैप करना था: सरणी ("\ x5c", "\ x2a", "\ x28", "\ x29") इसे काम करने के लिए। –

1

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

तब भी क्वेरी भाषा और अद्यतन भाषा पूरी तरह से अलग हो जाती है।

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

इसी प्रकार आप केवल उस डेटा को चुनने पर विचार कर सकते हैं जिसे आप प्रतिक्रिया से उम्मीद करते हैं और इसे प्रदर्शित करने के लिए वापस कर सकते हैं।

+0

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

2

विचार करने के लिए एक आइटम यह है कि एक एलडीएपी उपयोगकर्ता नाम (डीएन) के साथ बाध्य है लेकिन कोई पासवर्ड अज्ञात बंधन नहीं माना जाता है। इसलिए यदि आप रिक्त पासवर्ड पास करते हैं, तो उपयोगकर्ता को सत्यापित करने के लिए पास किए गए प्रमाण-पत्र एलडीएपी के माध्यम से बाध्य कर सकते हैं, और आपने इसे पारित किया है, तो आप किसी को गलत तरीके से दे सकते हैं।

+0

धन्यवाद, यह मैं समझता हूं और वास्तव में इंजेक्शन नहीं है। – Chris

+0

@ क्रिस: सहमत है, वास्तव में एक इंजेक्शन नहीं, लेकिन एक ही मूल समस्या अंतरिक्ष के भीतर। – geoffc

+1

इस उत्तर को पढ़ने के बाद, मैंने तुरंत एक ऐप का परीक्षण किया जो हमारे पास विकास में है और यह विशेष समस्या पकड़ी नहीं गई, धन्यवाद! –

0
function ldap_quote($str) { 
    return str_replace(
      array('\\', ' ', '*', '(', ')'), 
      array('\\5c', '\\20', '\\2a', '\\28', '\\29'), 
      $str 
    ); 
} 
+4

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, _how_ और/या _why_ के बारे में अतिरिक्त संदर्भ प्रदान करने से समस्या हल हो जाती है, समस्या का दीर्घकालिक मान बेहतर होगा। –

1

PHP में उपयोग करता है 5.6+ आप फिल्टर मूल्यों और RDNs के लिए ldap_escape फ़ंक्शन का उपयोग किया जाना चाहिए। जैसे:

// Escaping an LDAP filter for ldap_search ... 
$username = ldap_escape($username, null, LDAP_ESCAPE_FILTER); 
$filter = "(sAMAccountName=$username)"; 

// Escaping a DN to be used in an ldap_add, or a rename... 
$rdn = ldap_escape('Smith, John', null, LDAP_ESCAPE_DN); 
$dn = "cn=$rdn,dc=example,dc=local"; 

साथ ही, आप खोजों में विशेषता नाम के लिए उपयोगकर्ता इनपुट स्वीकार कर रहे हैं यदि आप मान्य किया जाना चाहिए कि यह एक स्वीकार्य OID है या विशेषता नाम। आप क्या कर सकते हैं कि इस तरह एक समारोह के साथ:

/** 
* Validate an attribute is an OID or a valid string attribute name. 
* 
* @param string 
* @return bool 
*/ 
function isValidAttributeFormat($value) 
{ 
    $matchOid = '/^[0-9]+(\.[0-9]+?)*?$/'; 
    $matchDescriptor = '/^\pL([\pL\pN-]+)?$/iu'; 

    return preg_match($matchOid, $value) 
     || preg_match($matchDescriptor, $value); 
} 

$attribute = 'sAMAccountName'; 
$value = 'foo'; 

if (!isValidAttributeFormat($attribute)) { 
    throw new \InvalidArgumentException(sprintf('Invalid attribute name: %s', $attribute)); 
} 

$value = ldap_escape($value, null, LDAP_ESCAPE_FILTER); 
$filter = "($attribute=$value)";