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.
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();
}
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)
utiliser Bibliothèque AntiXss de l'adresse: https://www.nuget.org/packages/AntiXss
string encoded = Microsoft.Security.Application.Encoder.LdapFilterEncode(input);
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.
utiliser PInvoke avec DsQuoteRdnValueW
. Pour le code, voir ma réponse à une autre question: https://stackoverflow.com/a/11091804/628981