Comment échapper à une chaîne en C#, pour une utilisation dans une requête LDAP

j'ai une requête LDAP, que j'utilise pour effectuer une recherche dans C#. Il utilise deux variables de chaîne (nom d'utilisateur et domaine) qui doivent être échappées pour des raisons de sécurité.

comment échapper aux cordes? Existe-t-il une fonction disponible en C#.NET pour faire ça?


exemple de conditions de recherche LDAP:

(objectCategory=person)
(userprincipalname=username@domain*)
(samaccountname=username)

exemple de chaîne de requête LDAP en C#:

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

Edit: J'ai déjà la requête LDAP qui fonctionne, et je renvoie les résultats. Tout ce que je veux, c'est échapper aux paramètres.

14
demandé sur Sophia 2009-03-16 06:21:43

6 réponses

ce qui suit est ma traduction du code Java mentionné par 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(@"c");
                break;
            case '*':
                escape.Append(@"a");
                break;
            case '(':
                escape.Append(@"");
                break;
            case ')':
                escape.Append(@"");
                break;
            case '\u0000':
                escape.Append(@""151900920"");
                break;
            case '/':
                escape.Append(@"f");
                break;
            default:
                escape.Append(current);
                break;
        }
    }

    return escape.ToString();
}
25
répondu Jeow Li Huan 2012-09-09 16:53:27

j'ai trouvé une solution ici, dans un billet de blog sur L'Injection LDAP

cette solution implique d'ajouter votre propre fonction pour échapper au nom d'utilisateur et au nom de domaine, sa solution est en Java, mais l'idée est là.

aussi MSDN indique quels caractères spéciaux doivent être remplacés par des séquences d'échappement.

autant que je sache, il ne semble pas y avoir de méthode pour s'échapper Les chaînes LDAP dans le Système.DirectoryServices (comme il est dans HttpServerUtility pour les Url, etc)

5
répondu Sophia 2012-07-30 01:05:13

utiliser Bibliothèque AntiXss de l'adresse: https://www.nuget.org/packages/AntiXss

string encoded = Microsoft.Security.Application.Encoder.LdapFilterEncode(input);
3
répondu opis-kladno 2016-11-22 11:59:50

peut-être laisser quelqu'un d'autre s'en occuper? Voir LINQtoAD .

2
répondu Ðаn 2009-03-16 03:27:03

essayez-vous d'empêcher une sorte d'attaque par injection contre votre serveur de répertoires via l'entrée de l'utilisateur? Si c'est le cas, je validerais simplement L'entrée avec Regex avant de la passer à LDAP.

2
répondu Jason Jackson 2009-03-16 03:28:33

utiliser PInvoke avec DsQuoteRdnValueW . Pour le code, voir ma réponse à une autre question: https://stackoverflow.com/a/11091804/628981

0
répondu Sean Hall 2017-05-23 12:01:29