Java LDAP搜索某些属性上的某些字符失败
我有一个类似这样的查询:Java LDAP搜索某些属性上的某些字符失败,java,ldap,spring-ldap,Java,Ldap,Spring Ldap,我有一个类似这样的查询: (|(mail=andrew*)(cn=andrew*)(sn=andrew*)(telephoneNumber=andrew*)) i、 它从UI中获取一个搜索词,并在一系列属性中查找与词*匹配的项 在本例中,用户输入andrew,应用程序添加通配符。如果用户输入andrew`(向后勾选),应用程序将查找andrew`* 我注意到,如果在搜索的属性中包含电话号码,则查询会失败,并出现javax.naming.invalidateTributeValueExcepti
(|(mail=andrew*)(cn=andrew*)(sn=andrew*)(telephoneNumber=andrew*))
i、 它从UI中获取一个搜索词,并在一系列属性中查找与词*匹配的项
在本例中,用户输入andrew,应用程序添加通配符。如果用户输入andrew`(向后勾选),应用程序将查找andrew`*
我注意到,如果在搜索的属性中包含电话号码,则查询会失败,并出现javax.naming.invalidateTributeValueException,如果排除了电话号码,则查询不会出错
我对backtick本身并不特别感兴趣,但由于它在LDAP搜索中不是一个特殊的字符,我想知道为什么会出现这种行为,以及其他字符是否会产生类似的结果。如果我能弄清楚如何查询它,模式中会有什么东西解释这一点,还是会有其他东西
如果重要的话,可以通过Java应用程序中的Spring库进行访问。由于电话号码属性上的属性值约束,查询可能会失败。电话号码属性的语法如中所述。在电话号码值中,倒勾确实似乎是无效字符 现在,我可能错了,但在阅读您的问题时,您似乎正在尝试使用字符串连接构造过滤器。请注意,您应该永远不要使用字符串连接构建任何类型的查询,尤其是当部分查询来自用户输入时。我相信您知道SQL查询就是这种情况,在使用LDAP时也是如此 SpringLDAP提供了两种方法来帮助您构建LDAP查询。首选的方法是使用LDAP查询API(高级用法)。旧的不推荐使用但仍在运行的方法是使用旧参考文档中记录的过滤器类
使用这些实用程序,您无需跟踪哪些字符需要编码以及编码时间。您还消除了任何查询注入攻击的风险 谢谢,这看起来很合适。不推荐使用的API看起来就是正在使用的API,这可能解释了为什么尚未处理此API?在这种特殊情况下,无论如何都需要小心,因为在与电话号码匹配时,回勾根本无效。这不是由库来处理的,因为如果违反了属性语法,我们最好还是抛出一个类似的异常。库仅处理不安全字符的转义。对于这些类型的属性,您无论如何都需要对输入进行清理,这在一般情况下肯定是个难题,但对于电话号码,您可以轻松地将所有非数字字符替换为空格,并使用WhitespaceWildcardsFilter。