某些属性的某些字符的 LDAP 搜索失败

LDAP search fails for certain characters on some attributes

我有一个看起来像这样的查询:

(|(mail=andrew*)(cn=andrew*)(sn=andrew*)(telephoneNumber=andrew*))

即它从 UI 中获取一个搜索词,并在一系列属性中查找与词* 的匹配项。

本例中用户输入andrew,应用添加通配符。如果用户输入 andrew`(尾随勾号),应用会查找 andrew`*.

我注意到如果 telephoneNumber 包含在搜索到的属性中,查询将失败并显示 javax.naming.InvalidAttributeValueException,如果它被排除在外,则查询工作正常。

我对单独的反引号不是特别感兴趣,但由于它不是 LDAP 搜索中的特殊字符,我想知道为什么我会出现这种行为以及其他字符是否会产生类似的结果。如果我能弄清楚如何查询它,模式中是否会有解释这一点的东西,或者它会是其他东西吗?

如果重要,通过 Java 应用程序中的 Spring 库访问。

查询可能因 telephoneNumber 属性的属性值限制而失败。 this RFC 中描述了 telephoneNumber 属性的语法。倒勾似乎确实是 telephoneNumber 值中的无效字符。

现在,我可能是错的,但阅读您的问题似乎您正在尝试使用字符串连接来构建过滤器。请注意,您应该永远不要,永远不要使用字符串连接构建任何类型的查询,尤其是当部分查询来自用户输入时。我确定您知道 SQL 查询就是这种情况,当您使用 LDAP 时也是如此。

Spring LDAP 提供了两种方法来帮助您构建 LDAP 查询。首选方法是使用记录在 here and (advanced usage) here. The old deprecated - but still functioning - way to do it is using the filter classes, documented in the old reference documentation here.

中的 LDAP 查询 API

使用这些实用程序,您无需跟踪哪些字符需要编码以及何时编码。您还消除了查询注入攻击的任何风险。