2010-06-12 8 views
18

Tôi đang làm việc trên ứng dụng máy tính để bàn đầu tiên truy vấn LDAP. Tôi đang làm việc trong C dưới unix và sử dụng opends, và tôi mới làm quen với LDAP. Sau khi woking một thời gian trên đó tôi nhận thấy rằng người dùng có thể thay đổi truy vấn LDAP bằng cách tiêm mã độc hại.
Tôi muốn biết kỹ thuật khử trùng nào được biết đến, không chỉ cho phát triển C/unix mà còn trong các thuật ngữ tổng quát hơn, tức là phát triển web, v.v.
Tôi nghĩ rằng thoát bằng và dấu chấm phẩy là đủ, nhưng không chắc chắn.Ngăn chặn tiêm LDAP

Đây là một mảnh nhỏ của mã để tôi có thể làm cho rõ ràng hơn câu hỏi:

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

Rõ ràng tôi cần phải khử trùng $ userName, như đã nêu trong này OWASP ARTICLE

+2

Có RFC nói về thoát bộ lọc tìm kiếm LDAP (http://www.ietf.org/rfc/rfc2254.txt) nhưng không tập trung vào bảo mật. Tuy nhiên, nó liệt kê các mục sau đây khi yêu cầu thoát: *() \ và NUL (0x00). Vì vậy, tôi sẽ thêm dấu hoa thị và dấu gạch chéo ngược vào danh sách của bạn. Không thể tìm thấy bất kỳ nguồn thực sự có thẩm quyền nào cho chủ đề này. Không chắc chắn nếu có một số góc unicode bạn cần phải lo lắng về, là tốt. Cá nhân, tôi đã sử dụng một danh sách trắng rất hạn chế (chữ số, ký tự, dấu gạch dưới và không gian) về cách triển khai của tôi. –

+0

+1 câu hỏi hay. – rook

+0

có thể trùng lặp của [Cách thoát chuỗi trong C#, để sử dụng trong truy vấn LDAP] (http://stackoverflow.com/questions/649149/how-to-escape-a-string-in-c-for-use -in-an-ldap-query) – Randolpho

Trả lời

3

Bạn đã nhận được câu trả lời trong nhận xét câu hỏi. RFC 2254 có nó.

Đây là những gì tôi sử dụng trong PHP. Một cái gì đó tương đương trong ngôn ngữ của bạn là đủ.

/** 
* 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

Và đây là bản dịch C# của tôi về các chức năng thoát trong blog được đề cập bởi @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(); 
}