2016-08-04 128 views
2

我有一个查询看起来是这样的:LDAP搜索失败

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

即它需要一个搜索词从UI并寻找对抗项的比赛*跨越一堆属性。

用户输入安德鲁在这种情况下和应用程序增加了通配符。如果用户输入andrew`(拖尾),应用程序会查找andrew` *。

我注意到,如果telephoneNumber包含在搜索的属性中,查询将失败,并返回一个javax.naming.InvalidAttributeValueException,如果它被排除,那么查询的工作没有错误。

我不是在单独的反引号特别感兴趣,但因为它不是在LDAP搜索一个特殊字符我不知道为什么我得到这个行为,如果其他字符都将产生类似的结果。如果我能弄清楚如何查询它,或者它会是别的什么,那么在模式中是否会有解释这一点的东西?

如果它的事项,通过弹簧库中的Java应用程序访问。

回答

1

查询可能失败,因为对telephoneNumber属性的属性值约束。 telephoneNumber属性的语法在this RFC中描述。在tickNumber值中,返回打勾似乎确实是无效的字符。现在

,我可能是错的,但阅读您的问题似乎您试图构建使用字符串连接过滤器。请注意,你应该永不,永远建立任何使用字符串连接的查询,尤其是当部分查询来自用户输入。我相信你知道这是SQL查询的情况,当你使用LDAP时也是如此。

Spring LDAP提供了两种方法来帮助您构建LDAP查询。首选方法是使用记录为here和(高级使用)here的LDAP查询API。旧的已弃用但仍能正常工作的方法是使用过滤器类,在旧参考文档here中有记录。

使用这些工具,你将不再需要跟踪哪些字符需要编码和时间。您还可以消除查询注入攻击的风险。

+0

谢谢,这看起来不错。不推荐使用的API看起来是正在使用的API,这可能解释了为什么这个问题尚未得到处理? – rich

+1

在这种特殊情况下,无论如何您都必须小心谨慎,因为在与telephoneNumber进行匹配时,返回打勾无效。这是**不由库处理,因为我们可以做的最好的方法是抛出类似的异常,如果属性语法被违反。该库只处理不安全字符的转义。对于这些类型的属性,无论如何您都需要对输入进行清理,这肯定会让人感到痛苦,但对于电话号码,您可以轻松地用空格替换所有非数字字符并使用WhitespaceWildcardsFilter。 – marthursson