繁体   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