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

时间:2009-03-16 03:21:44

标签: c# .net active-directory ldap ldap-query

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

我应该如何摆脱弦乐? C#.NET中是否有可用的功能来执行此操作?


示例LDAP搜索条件:

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

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

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

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

6 个答案:

答案 0 :(得分:28)

以下是我从Sophia提到的Java代码到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();
}

答案 1 :(得分:5)

我在a blog post about LDAP Injection

中找到了解决方案

此解决方案涉及添加您自己的函数以转义用户名和域名,他的解决方案是Java,但想法就在那里。

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

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

答案 2 :(得分:3)

使用地址为https://www.nuget.org/packages/AntiXss

的AntiXss库
HttpContext.Current

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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