2009-03-16 9 views
14

Tengo una consulta LDAP, que estoy usando para realizar una búsqueda en C#. Utiliza dos variables de cadena (nombre de usuario y dominio) que deben ser escapadas por razones de seguridad.Cómo escapar de una cadena en C#, para usar en una consulta LDAP

¿Cómo debo escapar de las cadenas? ¿Hay una función disponible en C# .NET para hacer esto?


Ejemplo LDAP condiciones de búsqueda:

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

Ejemplo de cadena de consulta LDAP en C#:

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

Edit: ya tienen el trabajo de consulta LDAP, y los resultados que regresan. Todo lo que quiero es escapar de los parámetros.

+0

Sophia, lo que realmente necesita para aplicar el userPrincipalName a la consulta? Probablemente podrías salir con solo consultar el dominio y el nombre de la cuenta samac. Me parece que me sale bien al hacer eso. –

+0

Me preguntaba si lo estaba haciendo bien: esta es la primera vez que uso el directorio activo. ¿Qué quieres decir con consultar el dominio? Estoy obteniendo el resultado usando un DirectorySearcher y SearchResult, el resultado no parece tener ninguna propiedad obvia llamada dominio o similar – Sophia

+0

¿Qué quieres decir con escapar de la cadena? – CodeRedick

Respuesta

25

La siguientes es mi traducción del código Java mencionado por Sophia en 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

¿Quizás dejes que alguien más se preocupe por ello? Ver LINQtoAD.

+0

¿Parece exagerado por solo escapar de una cadena? – Sophia

+2

Creo que está diciendo que LINQtoAD sería una mejor manera de consultar AD en general. Al igual que usted, podría escribir consultas SQL directas y luego extraer un conjunto de datos ... pero LINQtoSQL hace que todo sea mucho más fácil ... – CodeRedick

+0

Oh, ya veo. Ya tengo la consulta para AD trabajando con solo dos líneas (usando los métodos System.DirectoryServices), así que realmente no la necesito, no estoy usando AD en ningún otro lado de mi proyecto. – Sophia

2

¿Está tratando de evitar algún tipo de ataque de inyección contra su servidor de directorio a través de la entrada del usuario? Si ese es el caso, solo validaría la entrada con Regex antes de pasarla a LDAP.

+0

El nombre de usuario y el nombre de dominio no deben tener ninguno de los caracteres que deben escaparse en primer lugar:, \ # + < >; "= – UncleO

+0

" Si alguno de los siguientes caracteres especiales debe aparecer en el filtro de búsqueda como literales, debe ser reemplazado por la secuencia de escape indicada. "Http://msdn.microsoft.com/en-us/library/aa746475.aspx – Sophia

+0

La consulta LDAP puede involucrar correo electrónico, que PUEDE contener '=', '+', etc. –

5

he encontrado una solución aquí, en a blog post about LDAP Injection

Esta solución consiste en añadir su propia función para escapar el nombre de usuario y dominio, su solución está en Java, pero la idea está ahí.

También MSDN enumera los caracteres especiales que deben reemplazarse por secuencias de escape.

Por lo que yo puedo decir que no parece haber ningún método para escapar de las cadenas LDAP en System.DirectoryServices (como existe en HttpServerUtility para las direcciones URL, etc.)

+0

¿por qué usan tantas barras invertidas juntas? –

Cuestiones relacionadas