Предотвращение инъекций LDAP - PullRequest
18 голосов
/ 12 июня 2010

Я работаю над своим первым настольным приложением, которое запрашивает LDAP.Я работаю в C под Unix и использую opends, и я новичок в LDAP.Спустя некоторое время я заметил, что пользователь может изменить запрос LDAP, внедрив вредоносный код.
Я хотел бы знать, какие методы очистки известны не только для разработки на C / Unix, но и в более общем плане.термины, т. е. веб-разработка и т. д.
Я думал, что эквалайзера равно и точка с запятой будет достаточно, но я не уверен.

Вот небольшой фрагмент кода, чтобы я мог прояснить вопрос:

 String ldapSearchQuery = "(cn=" + $userName + ")";
 System.out.println(ldapSearchQuery); 

Очевидно, что мне нужно очистить $ userName, как указано в этом СТАТЬЯ OWASP

Ответы [ 4 ]

10 голосов
/ 22 июня 2010

OWASP - это хорошее руководство по безопасности, которое я часто использую, и содержит пример кода (на Java, но вы должны быть в состоянии перевести): http://www.owasp.org/index.php/Preventing_LDAP_Injection_in_Java

Кроме того, вот конкретная ссылка на Active Directory:http://www.rlmueller.net/CharactersEscaped.htm

3 голосов
/ 11 июля 2010

Вы уже получили ответ в комментарии к вопросу.В RFC 2254 это есть.

Вот что я использую в PHP.Что-то эквивалентное на вашем языке должно быть достаточно.

/**
 * Sanitizes ldap search strings.
 * See rfc2254
 * @link http://www.faqs.org/rfcs/rfc2254.html
 * @since 1.5.1 and 1.4.5
 * @param string $string
 * @return string sanitized string
 * @author Squirrelmail Team
 */
function ldapspecialchars($string) {
    $sanitized=array('\\' => '\5c',
                     '*' => '\2a',
                     '(' => '\28',
                     ')' => '\29',
                     "\x00" => '\00');

    return str_replace(array_keys($sanitized),array_values($sanitized),$string);
}
2 голосов
/ 28 июня 2017

И это мой C # перевод функций escape в блоге, упомянутом @ TrueBlood.

/// <summary>
/// Escape a string for usage in an LDAP DN to prevent LDAP injection attacks.
/// There are certain characters that are considered special characters in a DN.
/// The exhaustive list is the following: ',','\','#','+','<','>',';','"','=', and leading or trailing spaces
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static string EscapeForDN(string name)
{
    StringBuilder sb = new StringBuilder();

    if (name.Length > 0 && ((name[0] == ' ') || (name[0] == '#')))
    {
        sb.Append('\\'); // add the leading backslash if needed
    }

    for (int i = 0; i < name.Length; i++)
    {
        char curChar = name[i];
        switch (curChar)
        {
            case '\\':
                sb.Append(@"\\");
                break;
            case ',':
                sb.Append(@"\,");
                break;
            case '+':
                sb.Append(@"\+");
                break;
            case '"':
                sb.Append("\\\"");
                break;
            case '<':
                sb.Append(@"\<");
                break;
            case '>':
                sb.Append(@"\>");
                break;
            case ';':
                sb.Append(@"\;");
                break;
            default:
                sb.Append(curChar);
                break;
        }
    }

    if (name.Length > 1 && name[name.Length - 1] == ' ')
    {
        sb.Insert(sb.Length - 1, '\\'); // add the trailing backslash if needed
    }

    return sb.ToString();
}

/// <summary>
/// Escape a string for usage in an LDAP DN to prevent LDAP injection attacks.
/// </summary>
public static string EscapeForSearchFilter(string filter)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < filter.Length; i++)
    {
        char curChar = filter[i];
        switch (curChar)
        {
            case '\\':
                sb.Append("\\5c");
                break;
            case '*':
                sb.Append("\\2a");
                break;
            case '(':
                sb.Append("\\28");
                break;
            case ')':
                sb.Append("\\29");
                break;
            case '\u0000':
                sb.Append("\\00");
                break;
            default:
                sb.Append(curChar);
                break;
        }
    }
    return sb.ToString();
}
0 голосов
/ 09 августа 2018

Если вы используете Spring, существует класс LdapEncoder (https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/support/LdapEncoder.html), который предоставляет методы для кодирования значений в фильтре и DN. Этот класс фактически присутствует по крайней мере в двух библиотеках Spring, spring-ldap-core и spring-security-ldap. И дважды в последнем:)

...