19 Stimmen

Wie man eine Zeichenkette in C# zur Verwendung in einer LDAP-Abfrage entschlüsselt

Ich habe eine LDAP-Abfrage, die ich verwende, um eine Suche in C# durchzuführen. Sie verwendet zwei String-Variablen (Benutzername und Domäne), die aus Sicherheitsgründen escaped werden müssen.

Wie kann ich die Zeichenketten entfernen? Gibt es eine Funktion in C#.NET, die dies ermöglicht?


Beispiel für LDAP-Suchbedingungen :

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

Beispiel für eine LDAP-Abfragezeichenfolge in C# :

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

Bearbeiten: Ich habe bereits die LDAP-Abfrage funktioniert, und die Ergebnisse zurück. Alles, was ich will, ist, die Parameter zu entkommen.

35voto

Jeow Li Huan Punkte 3708

Das Folgende ist meine Übersetzung des von Sophia erwähnten Java-Codes in 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();
}

6voto

Sophia Punkte 5443

Ich habe hier eine Lösung gefunden, in ein Blogbeitrag über LDAP Injection

Bei dieser Lösung müssen Sie eine eigene Funktion hinzufügen, um den Benutzernamen und den Domänennamen zu entschlüsseln. Seine Lösung ist in Java, aber die Idee ist vorhanden.

Auch MSDN listet auf, welche Sonderzeichen durch Escape-Sequenzen ersetzt werden müssen.

Soweit ich sagen kann, scheint es keine Methode für das Escaping von LDAP-Zeichenfolgen in System.DirectoryServices (wie es in HttpServerUtility für URLs usw.) zu sein

4voto

opis-kladno Punkte 91

Verwenden Sie die AntiXss-Bibliothek von address: https://www.nuget.org/packages/AntiXss

string encoded = Microsoft.Security.Application.Encoder.LdapFilterEncode(input);

2voto

Ðаn Punkte 10643

Vielleicht sollte sich jemand anderes darum kümmern? Siehe LINQtoAD .

1voto

Jason Jackson Punkte 16792

Versuchen Sie, eine Art von Injektionsangriff auf Ihren Verzeichnisserver über Benutzereingaben zu verhindern? Wenn das der Fall ist, würde ich die Eingabe mit Regex validieren, bevor sie an LDAP übergeben wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X