18

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

我应该如何逃避字符串?C#.NET 中是否有可用的函数来执行此操作?


LDAP 搜索条件示例:

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

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

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

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

4

6 回答 6

31

以下是我将 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();
}
于 2009-03-29T16:37:37.010 回答
6

我在这里找到了一个解决方案,在一篇关于 LDAP Injection 的博客文章中

这个解决方案涉及添加你自己的函数来转义用户名和域名,他的解决方案是在 Java 中,但想法是存在的。

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

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

于 2009-03-16T05:50:28.157 回答
4

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

string encoded = Microsoft.Security.Application.Encoder.LdapFilterEncode(input);
于 2016-11-22T11:59:50.300 回答
2

也许让别人担心?请参阅LINQtoAD

于 2009-03-16T03:27:03.727 回答
2

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

于 2009-03-16T03:28:33.970 回答
0

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

于 2012-06-18T22:11:19.153 回答