Domanda

Ho una query LDAP, che sto usando per eseguire una ricerca in C #. Utilizza due variabili stringa (nome utente e dominio) che devono essere salvate per motivi di sicurezza.

Come dovrei sfuggire alle stringhe? Esiste una funzione disponibile in C # .NET per farlo?


Condizioni di ricerca LDAP di esempio:

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

Esempio di stringa di query LDAP in C #:

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

Modifica: la query LDAP funziona già e restituisco risultati. Tutto quello che voglio è sfuggire ai parametri.

È stato utile?

Soluzione

Quella che segue è la mia traduzione dal codice Java menzionato da Sophia 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();
}

Altri suggerimenti

Ho trovato una soluzione qui, in un post sul blog sull'iniezione LDAP

Questa soluzione prevede l'aggiunta della propria funzione per sfuggire al nome utente e al nome di dominio, la sua soluzione è in Java, ma l'idea è lì.

Anche MSDN elenca i caratteri speciali che devono essere sostituiti da sequenze di escape.

Per quanto ne so non sembra esserci alcun metodo per sfuggire alle stringhe LDAP in System.DirectoryServices (come in HttpServerUtility per URL ecc.)

Utilizza la libreria AntiXss dall'indirizzo: https://www.nuget.org/packages/AntiXss

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

Forse far preoccupare qualcun altro? Vedi LINQtoAD .

Stai cercando di prevenire una sorta di attacco di iniezione contro il tuo server di directory tramite l'input dell'utente? In tal caso, convaliderei l'input con Regex prima di passarlo a LDAP.

Usa PInvoke con < code> DsQuoteRdnValueW . Per il codice, vedi la mia risposta a un'altra domanda: https://stackoverflow.com/a/11091804/628981

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top