2016-12-14 52 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. 

以這種方式獲得的名稱具有所需數量的反斜槓。它能夠消耗我可以發明的各種奇怪角色,包括正斜槓。