Весь фильтр поиска LDAP должен быть допустимой UTF-8 строкой.Существует пять (5) значений, которые, если они появляются в поисковом фильтре, должны быть экранированы с использованием обратной косой черты \
и двухзначного шестнадцатеричного кода для экранируемого символа.Значения, которые должны быть экранированы: *
, (
, )
, \
и нулевой байт 0
;поэтому "
и '
являются допустимыми и действительными символами в поисковом фильтре.В языке, подобном Java, который содержит строковый литерал между "
символами, символ "
, являющийся частью строкового литерала, должен быть экранирован.
В одном примере вы перечисляете фильтр с обратной косой чертой \
символ в фильтре.Обратная косая черта должна быть экранирована в фильтре с использованием обратной косой черты и шестнадцатеричного кода для обратной косой черты, например, "(cn=abc\5c\"and'def)'"
.В другом примере вы указываете в качестве фильтра "(cn=abc"and'def)"
, который на самом деле является допустимым поисковым фильтром - игнорируя тот факт, что внутренний "
не экранирован, как это должно быть для компиляции.
В порядкеНапример, я создал объект в каталоге на локальном хосте, прослушивающем порт 1389 с префиксом или контекстом именования dc=example,dc=com
, используя следующий LDIF:
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 - это превосходный SDK от UnboundID.Обратите внимание, что символ "
экранирован в фильтре, так что класс будет компилироваться, но это не имеет никакого отношения к самому тексту фильтра.