簡體   English   中英

連字符是否在 LDAP DN 中編碼?

[英]Is the hyphen encoded in LDAP DNs?

我正在使用 AntiXss nuget 包 v4.3.0 對 LDAP 連接和查詢中使用的字符串進行編碼。 我發現了一些我不明白的東西:如果我打電話

Microsoft.Security.Application.Encoder.LdapDistinguishedNameEncode("test-name")

我得到輸出

test#2Dname

在我搜索的任何地方(例如此處此處)甚至在RFC 標准中(據我所知),它總是說連字符不是要轉義的字符。

有什么我沒有得到的東西還是圖書館的錯誤?

我的 LDAP 樹中的一個 RDN 中有一個連字符(“CN=John Doe,DC=test-name,DC=net”),所以這是我必須處理的情況。

那個圖書館現在似乎沒有多少維護,所以它可能是一個真正的 PITA。

稍微瀏覽一下這個包的 IL,我可以看到它確實編碼了一個連字符(char 45)。

實際上,以下 32 到 126(含)之間的字符都將被LdapDistinguishedNameEncode轉義:

33 = !
34 = "
38 = &
39 = '
43 = +
44 = ,
45 = -
59 = ;
60 = <
61 = =
62 = >
92 = \
124 = |

為什么?

在庫中,一系列字符被聲明為“安全”,不需要轉義。 出於某種原因,上述字符已在LdapEncoder明確排除:

private static IEnumerable DistinguishedNameSafeList()
{
    for (int i = 32; i <= 126; i++)
        if (i != 44 && i != 43 && i != 34 && i != 92 && i != 60 && i != 62 && i != 38 && i != 33 && i != 124 && i != 61 && i != 45 && i != 39 && i != 59)
            yield return (object)i;
}

該怎么辦?

假設您不想自己重新實現庫中的代碼,我建議您可以進行一些令人討厭的字符串替換來糾正此問題:

Microsoft.Security.Application.Encoder.LdapDistinguishedNameEncode("test-name").Replace("#2D", "-");

感覺有點hacky,但如果你想保留連字符,我不知道你還有什么其他選擇。

RFC 4514

RFC 明確說明了轉義的字符,例如:

  • 出現在字符串開頭的空格 (' ' U+0020) 或數字符號 ('#' U+0023);
  • 出現在字符串末尾的空格 (' ' U+0020) 字符;
  • 字符 '"'、'+'、','、';'、'<'、'>' 或 '\\' 之一(U+0022、U+002B、U+002C、U+003B、U +003C、U+003E 或 U+005C);
  • 空 (U+0000) 字符。

然而,它接着說:

其他字符可能會被轉義。

這種有點含糊的陳述表明您可能期望轉義任何字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM