2011-07-27 8 views
0

ディレクトリにオブジェクトcn=abc"and'defがあります。私は、Javaの検索APIを使用しています:オブジェクト名に一重引用符または二重引用符がある場合にJava LDAP検索APIの検索フィルタを構成する方法

public LDAPSearchResults search(java.lang.String base, 
    int scope, 
    java.lang.String filter, 
    java.lang.String[] attrs, 
    boolean typesOnly, 
    LDAPSearchConstraints cons) 
    throws LDAPException 

私はabc\"and\'defとしてabc"and'defととしても、検索フィルタを与えてみました。リターン両方:

悪い検索フィルタ

オブジェクト名はそれに単一または二重引用符を持っている場合、検索フィルタを構築する方法として私を助けてください。

答えて

2

あなたのエスケープ処理にフィルタの力を使います。次のようなものがあります。

"(&(objectClass=user)(cn={0}))" 
3

有効なUTF-8文字列である必要があります。検索フィルターに表示する必要がある5つの値は、バックスラッシュ\とエスケープされる文字の2桁の16進コードを使用してエスケープする必要があります。エスケープする必要がある値は、*,(,),\、およびnullバイト0です。したがって、"'は、検索フィルタで有効で有効な文字です。 "文字の文字列リテラルを囲むJavaのような言語では、文字列リテラルの一部として表示される"文字をエスケープする必要があります。

例では、フィルターにバックスラッシュ\文字を含むフィルターをリストします。バックスラッシュとバックスラッシュの16進コードを使用して、フィルタでバックスラッシュをエスケープする必要があります(例:"(cn=abc\5c\"and'def)'")。もう1つの例では、フィルタ"(cn=abc"and'def)"として実際には正当な検索フィルタであるとリストしています。つまり、内側の"がコンパイルのためにエスケープされていないという事実は無視されます。

一例として、私は接頭辞でポート1389をリッスンしたり、次のLDIFを使用してコンテキストdc=example,dc=com命名私はlocalhostでディレクトリ内のオブジェクトを作成しました:

dn: cn=abc"and'def,dc=example,dc=com 
objectClass: top 
objectClass: person 
cn: abc"and'def 
sn: whatever 

私が検索するためにJavaクラスを書きましたがエントリー、それが発見されてはならない場合は、アサーション・エラーを投げる:予想通り、それが検索されるエントリは実際には存在しないため

import com.unboundid.ldap.sdk.Filter; 
import com.unboundid.ldap.sdk.LDAPConnection; 
import com.unboundid.ldap.sdk.LDAPException; 
import com.unboundid.ldap.sdk.SearchScope; 
import com.unboundid.ldap.sdk.SearchResult; 

public final class BSFilter { 
    public static void main(String... args) { 
    try { 
     Filter searchFilter = 
     Filter.create("cn=abc\"and'def"); 
     LDAPConnection connection = 
     new LDAPConnection("localhost",1389); 
     SearchResult searchResult = 
     connection.search("dc=example,dc=com",SearchScope.ONE, 
          searchFilter,"1.1"); 
     assert(searchResult.getSearchEntries().size() == 0); 
    } catch(LDAPException lex) { 
     lex.printStackTrace(); 
     return; 
    } 
    } 
} 

このクラスは、アサーションエラーをコンパイルし、スローされます。検索フィルターに関する情報については、RFC 4515を参照してください。使用されるLDAPSDKは、UnboundIDの優秀なSDKです。 "文字がフィルタでエスケープされるため、クラスはコンパイルされますが、フィルタテキスト自体とは何の関係もありません。

1

私はJNDIと、 'filterArgs'引数を取るsearch() overloadsのうちの1つを使用します。すべてのエスケープはあなたのために必要ですか?

関連する問題