2016-12-14 54 views
0

我插入一条记录到LDAP中使用JNDI的记录(通过双反斜线转义引号)。它的名字是c=""aa。 JNDI做了一件逃避我的工作,所以它以c=\"\"aa的分贝数降落。好的,这就是我期望考虑所有逃脱规则的原因。不能使用信息搜索结果中删除

当然现在我要删除这条记录。我可以搜索它并获得它的名字。 这个名字应该是很好的删除记录

的问题是,下面的代码:

SearchResult sr = obtainSearchResultInJndiWay(); 
System.out.println("name: " + sr.getName()) 

回报name: c=\\"\\"aa

这不起作用。我无法删除这样的项目,因为找不到。我应该删除项目c=\"\"aa,但我无法获得正确的LdapName。

我应该手动转换双反斜线?我甚至发现了这样做的第三方代码。这是否是另一个证明JNDI是一个可怜的概念,就像这个问题,关于forward slashes

我的解决方案是禁止在ldap名称中输入斜杠和引号。这是一个很好的解决方法吗?我期望什么其他陷阱?有没有任何指导如何安全地使用JNDI的Ldap?这些是一个迷失的人的问题。为了使问题更加清晰,Stack:如何处理这个问题

回答

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. 

以这种方式获得的名称具有所需数量的反斜杠。它能够消耗我可以发明的各种奇怪角色,包括正斜杠。