当对象名称中包含单引号或双引号时,如何为java ldap搜索api构造搜索过滤器

时间:2011-07-27 05:23:22

标签: java ldap

我在目录中有一个对象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。两者都回归:

  
    

糟糕的搜索过滤器

  

如果对象名称中包含单引号或双引号,请帮助我构建搜索过滤器。

3 个答案:

答案 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。是否需要所有逃脱。