Подтвердить что ты не робот

Как избежать строки в С#, для использования в запросе LDAP

У меня есть запрос LDAP, который я использую для выполнения поиска на С#. Он использует две строковые переменные (имя пользователя и домен), которые необходимо устранить по соображениям безопасности.

Как мне избежать строк? Есть ли функция, доступная в С#.NET для этого?


Пример условий поиска LDAP:

(objectCategory=person)
([email protected]*)
(samaccountname=username)

Пример строки запроса LDAP в С#:

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

Изменить: у меня уже есть работа с LDAP-запросом и возвращение результатов. Все, что я хочу, - это избежать параметров.

4b9b3361

Ответ 1

Ниже приведен мой перевод из Java-кода, упомянутого Sophia на С#.

/// <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();
}

Ответ 2

Я нашел решение здесь, в блоге об LDAP-инъекции

Это решение включает добавление вашей собственной функции для экранирования имени пользователя и имени домена, его решение на Java, но идея есть.

Также в MSDN перечислены специальные символы, которые необходимо заменить на escape-последовательности.

Насколько я могу судить, похоже, что нет никакого способа избежать строк LDAP в System.DirectoryServices (как в HttpServerUtility для URL-адресов и т.д.)

Ответ 3

Используйте библиотеку AntiXss с адреса: https://www.nuget.org/packages/AntiXss

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

Ответ 4

Может быть, пусть кто-то еще беспокоится об этом? См. LINQtoAD.

Ответ 5

Вы пытаетесь предотвратить какую-то инъекционную атаку против вашего сервера каталогов через ввод пользователя? Если это так, я просто проверил бы вход с Regex перед передачей его LDAP.