Come evitare una stringa in C #, per l'uso in una query LDAP
-
19-08-2019 - |
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.
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