2010-06-12 6 views
18

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

String ldapSearchQuery = "(cn=" + $userName + ")"; 
System.out.println(ldapSearchQuery); 

जाहिर है मैं के रूप में इस OWASP ARTICLE

+2

एक आरएफसी है जो एलडीएपी खोज फ़िल्टर (http://www.ietf.org/rfc/rfc2254.txt) से बचने के बारे में बात करती है, लेकिन यह सुरक्षा पर केंद्रित नहीं है। हालांकि, यह निम्न भाग सूचीबद्ध करता है जैसे भागने की आवश्यकता: *() \ और एनयूएल (0x00)। इसलिए मैं आपकी सूची में तारांकन और बैकस्लैश जोड़ूंगा। इस विषय के लिए कोई वास्तव में आधिकारिक स्रोत नहीं मिला। सुनिश्चित नहीं है कि कुछ यूनिकोड कोण हैं जिसके बारे में आपको चिंता करने की ज़रूरत है। निजी तौर पर, मैंने अपने कार्यान्वयन पर एक बहुत ही सीमित सफेद सूची (अंक, वर्ण, अंडरस्कोर और अंतरिक्ष) दृष्टिकोण का उपयोग किया। –

+0

+1 अच्छा सवाल है। – rook

+0

संभावित डुप्लिकेट [एलडीएपी क्वेरी में उपयोग के लिए सी # में स्ट्रिंग से कैसे बचें] (http://stackoverflow.com/questions/649149/how-to-escape-a-string-in-c-for-use -इन-ए-एलडीएपी-क्वेरी) – Randolpho

उत्तर

10

OWASP में कहा गया है, $ userName को साफ़ करने में की आवश्यकता है:

यहाँ कोड का एक छोटा सा टुकड़ा तो मैं स्पष्ट सवाल कर सकते हैं कि मैं एक बहुत का उपयोग करें, और उदाहरण कोड है (जावा में है, लेकिन आप अनुवाद करने में सक्षम होना चाहिए): http://www.owasp.org/index.php/Preventing_LDAP_Injection_in_Java

इसके अलावा, यहां किसी सक्रिय निर्देशिका विशिष्ट संदर्भ है: http://www.rlmueller.net/CharactersEscaped.htm

+0

+1 अच्छा और विस्तृत लेख – Matias

3

आपको पहले से ही प्रश्न टिप्पणी में आपका उत्तर मिला है। आरएफसी 2254 में यह है।

यहां मैं PHP में उपयोग करता हूं। आपकी भाषा में कुछ समकक्ष होना चाहिए।

/** 
* Sanitizes ldap search strings. 
* See rfc2254 
* @link http://www.faqs.org/rfcs/rfc2254.html 
* @since 1.5.1 and 1.4.5 
* @param string $string 
* @return string sanitized string 
* @author Squirrelmail Team 
*/ 
function ldapspecialchars($string) { 
    $sanitized=array('\\' => '\5c', 
        '*' => '\2a', 
        '(' => '\28', 
        ')' => '\29', 
        "\x00" => '\00'); 

    return str_replace(array_keys($sanitized),array_values($sanitized),$string); 
} 
1

और यह @TrueBlood द्वारा उल्लिखित ब्लॉग में भागने के कार्यों का मेरा सी # अनुवाद है।

/// <summary> 
/// Escape a string for usage in an LDAP DN to prevent LDAP injection attacks. 
/// There are certain characters that are considered special characters in a DN. 
/// The exhaustive list is the following: ',','\','#','+','<','>',';','"','=', and leading or trailing spaces 
/// </summary> 
/// <param name="name"></param> 
/// <returns></returns> 
public static string EscapeForDN(string name) 
{ 
    StringBuilder sb = new StringBuilder(); 

    if (name.Length > 0 && ((name[0] == ' ') || (name[0] == '#'))) 
    { 
     sb.Append('\\'); // add the leading backslash if needed 
    } 

    for (int i = 0; i < name.Length; i++) 
    { 
     char curChar = name[i]; 
     switch (curChar) 
     { 
      case '\\': 
       sb.Append(@"\\"); 
       break; 
      case ',': 
       sb.Append(@"\,"); 
       break; 
      case '+': 
       sb.Append(@"\+"); 
       break; 
      case '"': 
       sb.Append("\\\""); 
       break; 
      case '<': 
       sb.Append(@"\<"); 
       break; 
      case '>': 
       sb.Append(@"\>"); 
       break; 
      case ';': 
       sb.Append(@"\;"); 
       break; 
      default: 
       sb.Append(curChar); 
       break; 
     } 
    } 

    if (name.Length > 1 && name[name.Length - 1] == ' ') 
    { 
     sb.Insert(sb.Length - 1, '\\'); // add the trailing backslash if needed 
    } 

    return sb.ToString(); 
} 

/// <summary> 
/// Escape a string for usage in an LDAP DN to prevent LDAP injection attacks. 
/// </summary> 
public static string EscapeForSearchFilter(string filter) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < filter.Length; i++) 
    { 
     char curChar = filter[i]; 
     switch (curChar) 
     { 
      case '\\': 
       sb.Append("\\5c"); 
       break; 
      case '*': 
       sb.Append("\\2a"); 
       break; 
      case '(': 
       sb.Append("\\28"); 
       break; 
      case ')': 
       sb.Append("\\29"); 
       break; 
      case '\u0000': 
       sb.Append("\\00"); 
       break; 
      default: 
       sb.Append(curChar); 
       break; 
     } 
    } 
    return sb.ToString(); 
}