我正在使用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,我可以看到它确实编码了一个连字符(字符 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", "-");
感觉有点笨拙,但如果你想保留连字符,我看不出你还有什么其他选择。
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( 字符。
然而,它接着说:
其他字符可能会被转义。
这个有点模糊的陈述表明,您可能会期望任何字符的转义。