Pergunta

Eu tenho uma consulta LDAP, que estou usando para realizar uma pesquisa em C #. Ele usa duas variáveis ??de cadeia (nome de usuário e domínio) que precisam ser escapou por razões de segurança.

Como devo escapar das cordas? Existe uma função disponível em C # .NET para fazer isso?


condições de pesquisa Exemplo LDAP:

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

string de consulta Exemplo LDAP em C #:

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

Edit: Eu já tenho a consulta LDAP de trabalho, e retornando resultados. Tudo que eu quero é escapar os parâmetros.

Foi útil?

Solução

A seguir é a minha tradução do código Java mencionado por Sophia em 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();
}

Outras dicas

Eu encontrei uma solução aqui, na um blog post sobre injeção LDAP

Esta solução envolve a adição de sua própria função para escapar o nome de usuário e domínio, sua solução está em Java, mas a ideia está lá.

MSDN listas que caracteres especiais precisam ser substituídos por seqüências de escape.

Tanto quanto eu posso dizer que há não parece ser qualquer método para escapar strings LDAP em System.DirectoryServices (como há em HttpServerUtility para URLs etc)

Use AntiXSS biblioteca a partir do endereço: https://www.nuget.org/packages/AntiXss

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

Talvez deixar alguém se preocupe com isso? Consulte LINQtoAD .

Você está tentando evitar algum tipo de ataque de injeção contra o seu servidor de diretório via de entrada do usuário? Se for esse o caso, eu seria apenas validar a entrada com Regex antes de passá-lo para LDAP.

Use PInvoke com DsQuoteRdnValueW . Para código, ver a minha resposta a outra pergunta: https://stackoverflow.com/a/11091804/628981

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top