18

C# で検索を実行するために使用している LDAP クエリがあります。セキュリティ上の理由からエスケープする必要がある 2 つの文字列変数 (ユーザー名とドメイン) を使用します。

文字列をエスケープするにはどうすればよいですか? これを行うために 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インジェクションに関するブログ投稿で、ここで解決策を見つけました

この解決策には、ユーザー名とドメイン名をエスケープする独自の関数を追加することが含まれます。彼の解決策は Java ですが、アイデアはそこにあります。

また、MSDNには、エスケープ シーケンスに置き換える必要がある特殊文字が一覧表示されています。

私が知る限り、System.DirectoryServicesでLDAP文字列をエスケープする方法はないようです(URLなどのHttpServerUtilityにあるように)

于 2009-03-16T05:50:28.157 に答える
2

たぶん、他の誰かにそれを心配させますか?LINQtoADを参照してください。

于 2009-03-16T03:27:03.727 に答える
2

ユーザー入力によるディレクトリ サーバーへの何らかのインジェクション攻撃を防ごうとしていますか? その場合は、入力を LDAP に渡す前に正規表現で検証します。

于 2009-03-16T03:28:33.970 に答える
0

で PInvoke を使用しDsQuoteRdnValueWます。コードについては、別の質問に対する私の回答を参照してください: https://stackoverflow.com/a/11091804/628981

于 2012-06-18T22:11:19.153 に答える