有効な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です。 "
文字がフィルタでエスケープされるため、クラスはコンパイルされますが、フィルタテキスト自体とは何の関係もありません。