我的查询看起来像这样:
(|(mail=andrew*)(cn=andrew*)(sn=andrew*)(telephoneNumber=andrew*))
即。它从UI中获取搜索词,并在一堆属性中查找与term *的匹配。
用户在这种情况下输入andrew,应用程序添加通配符。如果用户输入andrew`(尾随勾号),则应用程序会查找andrew` *。
我注意到如果在搜索到的属性中包含了telephoneNumber,则查询将失败并显示javax.naming.InvalidAttributeValueException,如果它被排除,则查询可以正常运行。
我对单独的反叛并不特别感兴趣,但由于它不是LDAP搜索中的特殊字符,我想知道为什么我会得到这种行为,以及其他字符是否会产生类似的结果。如果我可以弄清楚如何查询它,或者它是否会成为其他东西,那么模式中是否会出现解释这一点的内容?
如果重要,可以通过Java应用程序中的Spring库进行访问。
答案 0 :(得分:1)
由于telephoneNumber属性的属性值限制,查询可能会失败。 telephoneNumber属性的语法在this RFC中描述。返回tick确实似乎是telephoneNumber值中的无效字符。
现在,我可能错了,但是在阅读您的问题时,您似乎正在尝试使用字符串连接构建过滤器。请注意,您应该从不,使用字符串连接构建任何类型的查询,尤其是当部分查询来自用户输入时。我确信你知道这是SQL查询的情况,当你使用LDAP时也同样如此。
Spring LDAP提供了两种帮助您构建LDAP查询的方法。首选方法是使用记录here和(高级用法)here的LDAP查询API。旧的已弃用但仍在运行的方法是使用旧参考文档here中记录的过滤器类。
使用这些实用程序,您无需跟踪需要编码的字符以及何时编码。您还可以消除查询注入攻击的任何风险。