我使用JNDI将记录插入Ldap。它的名字是c=""aa
。 JNDI做了一个为我逃避的工作,因此它以c=\"\"aa
的形式登陆db。好吧,考虑到所有那些逃避规则,这就是我的预期。
现在我当然要删除此记录。我可以搜索它并得到它的名字。 该名称应该可以删除记录。
问题是以下代码:
SearchResult sr = obtainSearchResultInJndiWay();
System.out.println("name: " + sr.getName())
返回name: c=\\"\\"aa
。
这不起作用。我无法删除此类项目,因为找不到该项目。我应该删除项c=\"\"aa
,但我无法获得正确的LdapName。
我应该手动转换双反斜杠吗?我甚至发现了第三方代码。这是另一个证据,证明JNDI是一个很差的概念,就像这个问题一样,关于forward slashes?
我的解决方案是禁止在ldap名称中输入斜杠和引号。这是一个很好的解决方法吗?我还有什么陷阱?是否有任何指导如何安全地使用JNDI Ldap?这些是一个迷路的人的问题。为了使问题更清楚Stack:如何处理此问题?
答案 0 :(得分:1)
最后我解决了这个问题。我相信这是无证的功能。我潜入了jdk源代码并浏览了src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java。关键部分如下:
CompositeName cn = new CompositeName();
cn.add(atom);
因此,他们将名称视为CompositeName
。本课程的文档提到了额外的转义。好的,一旦我们知道,返回的字符串的性质是什么,我们可以正确的方式使用它。
CompositeName compo = new CompositeName(sr.getName())
Name absolutePath = new LdapName(sBaseDn).addAll(compo)
// sBaseDn is the context (the address) in which the search was made.
以这种方式获得的名称具有所需的反斜杠数。它能够消耗我能发明的所有奇怪的角色,包括正斜杠。