如何在C#中转义字符串,以便在LDAP查询中使用

我有一个LDAP查询,我用它来在C#中执行搜索。 它使用两个字符串变量(用户名和域),出于安全原因需要对其进行转义。

我该怎么逃避弦乐? C#.NET中是否有可用的function来执行此操作?


示例LDAP搜索条件:

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

C#中的LDAP查询字符串示例:

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

编辑:我已经有LDAP查询工作,并返回结果。 我想要的只是逃避参数。

以下是我从Sophia提到的Java代码到C#的翻译。

 ///  /// Escapes the LDAP search filter to prevent LDAP injection attacks. ///  /// The search filter. ///  ///  /// The escaped search filter. 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(); } 

我在一篇关于LDAP注入的博客文章中找到了解决方案

这个解决方案涉及添加自己的函数来逃避用户名和域名,他的解决方案是Java,但想法就在那里。

MSDN还列出了转义序列需要替换哪些特殊字符。

据我所知,似乎没有任何方法可以在System.DirectoryServices中转义LDAP字符串(就像HttpServerUtility中的URL等)

使用地址: https ://www.nuget.org/packages/AntiXss中的AntiXss库

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

也许让其他人担心呢? 请参阅LINQtoAD 。

您是否试图通过用户输入阻止对目录服务器的某种注入攻击? 如果是这种情况,我会在将输入传递给LDAP之前使用Regexvalidation输入。

将PInvoke与DsQuoteRdnValueW一起DsQuoteRdnValueW 。 有关代码,请参阅我对其他问题的回答: https : //stackoverflow.com/a/11091804/628981