2009-03-16 24 views
14

Tôi có truy vấn LDAP mà tôi đang sử dụng để thực hiện tìm kiếm trong C#. Nó sử dụng hai biến chuỗi (tên người dùng và tên miền) cần phải được thoát vì lý do bảo mật.Cách thoát chuỗi trong C#, để sử dụng trong truy vấn LDAP

Tôi nên thoát khỏi các chuỗi bằng cách nào? Có một chức năng có sẵn trong C# .NET để làm điều này?


Ví dụ LDAP điều kiện tìm kiếm:

(objectCategory=person) 
([email protected]*) 
(samaccountname=username) 

Ví dụ LDAP chuỗi truy vấn trong C#:

string search = "(&(&(objectCategory=person)(userprincipalname=" 
     + username 
     + "@" 
     + domain 
     + "*)(samaccountname=" 
     + username 
     + ")))"; 

Edit: Tôi đã có những hoạt động truy vấn LDAP, và trả kết quả. Tất cả những gì tôi muốn là thoát khỏi các thông số.

+0

Sophia, bạn có thực sự cần phải áp dụng các userprincipalname với truy vấn? Bạn có thể có thể nhận được bằng cách chỉ truy vấn tên miền và samaccountname. Tôi dường như bị phạt bằng cách làm điều đó. –

+0

Tôi đã tự hỏi nếu tôi đã làm điều đó đúng - đây là lần đầu tiên tôi sử dụng thư mục hoạt động. Bạn có ý gì khi truy vấn tên miền? Tôi nhận được kết quả bằng cách sử dụng một DirectorySearcher và SearchResult, kết quả dường như không có bất kỳ tài sản rõ ràng được gọi là tên miền hoặc tương tự – Sophia

+0

Bạn có nghĩa là gì thoát chuỗi? – CodeRedick

Trả lời

25

Sau đây là bản dịch của tôi từ mã Java được Sophia nhắc đến trong C#.

/// <summary> 
/// Escapes the LDAP search filter to prevent LDAP injection attacks. 
/// </summary> 
/// <param name="searchFilter">The search filter.</param> 
/// <see cref="https://blogs.oracle.com/shankar/entry/what_is_ldap_injection" /> 
/// <see cref="http://msdn.microsoft.com/en-us/library/aa746475.aspx" /> 
/// <returns>The escaped search filter.</returns> 
private static string EscapeLdapSearchFilter(string searchFilter) 
{ 
    StringBuilder escape = new StringBuilder(); // If using JDK >= 1.5 consider using StringBuilder 
    for (int i = 0; i < searchFilter.Length; ++i) 
    { 
     char current = searchFilter[i]; 
     switch (current) 
     { 
      case '\\': 
       escape.Append(@"\5c"); 
       break; 
      case '*': 
       escape.Append(@"\2a"); 
       break; 
      case '(': 
       escape.Append(@"\28"); 
       break; 
      case ')': 
       escape.Append(@"\29"); 
       break; 
      case '\u0000': 
       escape.Append(@"\00"); 
       break; 
      case '/': 
       escape.Append(@"\2f"); 
       break; 
      default: 
       escape.Append(current); 
       break; 
     } 
    } 

    return escape.ToString(); 
} 
2

Có thể để người khác lo lắng về điều đó? Xem LINQtoAD.

+0

Điều đó có vẻ như quá mức cần thiết để thoát khỏi một chuỗi? – Sophia

+2

Tôi nghĩ rằng anh ấy nói rằng LINQtoAD sẽ là một cách tốt hơn để truy vấn AD tổng thể. Cũng giống như bạn _could_ viết các truy vấn SQL thẳng và sau đó kéo một tập dữ liệu ... nhưng LINQtoSQL làm mọi thứ trở nên dễ dàng hơn nhiều ... – CodeRedick

+0

Ồ, tôi hiểu rồi. Tôi đã có các truy vấn để AD làm việc với chỉ hai dòng (bằng cách sử dụng System.DirectoryServices phương pháp), vì vậy tôi không thực sự cần nó - Tôi không sử dụng AD bất cứ nơi nào khác trong dự án của tôi. – Sophia

2

Bạn đang cố gắng ngăn chặn một số loại tấn công tiêm vào máy chủ thư mục của mình thông qua đầu vào của người dùng? Nếu đó là trường hợp tôi sẽ chỉ xác nhận đầu vào với Regex trước khi chuyển nó vào LDAP.

+0

Tên người dùng và tên miền không được có bất kỳ ký tự nào cần được thoát ở nơi đầu tiên:, \ # + < >; "= – UncleO

+0

" Nếu bất kỳ ký tự đặc biệt nào sau đây phải xuất hiện trong bộ lọc tìm kiếm dưới dạng chữ, chúng phải được thay thế bằng chuỗi thoát được liệt kê. "Http://msdn.microsoft.com/en-us/library/aa746475.aspx – Sophia

+0

Truy vấn LDAP có thể liên quan đến email, có thể chứa '=', '+', v.v. –

5

Tôi tìm thấy một giải pháp ở đây, trong a blog post about LDAP Injection

Giải pháp này bao gồm việc thêm chức năng của riêng bạn để thoát khỏi tên người dùng và tên miền, giải pháp của ông là ở Java, nhưng ý tưởng là có.

Ngoài ra MSDN liệt kê các ký tự đặc biệt cần phải được thay thế bằng chuỗi thoát.

Theo như tôi có thể nói đó dường như không có bất kỳ phương pháp để thoát chuỗi LDAP trong System.DirectoryServices (như có trong HttpServerUtility cho URL vv)

+0

tại sao họ sử dụng quá nhiều dấu gạch chéo ngược cùng nhau? –

Các vấn đề liên quan