我在目录中有一个对象cn=abc"and'def
。我正在使用Java搜索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
。两者都回归:
糟糕的搜索过滤器
如果对象名称中包含单引号或双引号,请帮助我构建搜索过滤器。
答案 0 :(得分:4)
整个LDAP搜索过滤器必须是有效的UTF-8字符串。如果它们出现在搜索过滤器中,则必须使用反斜杠\
和转义字符的两位十六进制代码对其中的五(5)个值进行转义。必须转义的值包括*
,(
,)
,\
和空字节0
;因此,"
和'
是搜索过滤器中合法且有效的字符。在像Java这样的语言中,在"
个字符之间包含字符串文字,必须转义出现在字符串文字中的"
字符。
在一个示例中,您将在过滤器中列出带有反斜杠\
字符的过滤器。必须使用反斜杠和反斜杠的十六进制代码(例如"(cn=abc\5c\"and'def)'"
)在过滤器中转义反斜杠。在另一个示例中,您将列为过滤器"(cn=abc"and'def)"
,它实际上是一个合法的搜索过滤器 - 忽略内部"
未被转义的事实,因为它必须用于编译。
举例来说,我在localhost的目录中创建了一个对象,使用以下LDIF在端口1389上侦听前缀或命名上下文dc=example,dc=com
:
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 :(得分:2)
使用过滤器的力量来处理逃逸。类似的东西:
"(&(objectClass=user)(cn={0}))"
答案 2 :(得分:1)
我使用JNDI和其中一个带有“filterArgs”参数的search() overloads。是否需要所有逃脱。