连字符是否在 LDAP DN 中编码?
Is the hyphen encoded in LDAP DNs?
我正在使用 AntiXss nuget 包 v4.3.0 对 LDAP 连接和查询中使用的字符串进行编码。我发现了一些我不明白的东西:如果我调用
Microsoft.Security.Application.Encoder.LdapDistinguishedNameEncode("test-name")
我得到输出
test#2Dname
虽然我到处搜索(例如 here, here) or even in the RFC standard(据我所知)它总是说连字符不是要转义的字符。
有没有我没有得到的东西,或者这是库的错误?
我的 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 = |
为什么?
在库中,一系列字符声明为'safe',不需要转义。由于某些原因,上述字符已明确排除在 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 明确规定了转义字符,例如:
- a space (' ' U+0020) or number sign ('#' U+0023) occurring at the beginning of the string;
- a space (' ' U+0020) character occurring at the end of the string;
- one of the characters '"', '+', ',', ';', '<', '>', or '\' (U+0022, U+002B, U+002C, U+003B, U+003C, U+003E, or U+005C,
respectively);
- the null (U+0000) character.
然而,它接着说:
Other characters may be escaped.
这种含糊不清的陈述表明您可能希望转义任何字符。
我正在使用 AntiXss nuget 包 v4.3.0 对 LDAP 连接和查询中使用的字符串进行编码。我发现了一些我不明白的东西:如果我调用
Microsoft.Security.Application.Encoder.LdapDistinguishedNameEncode("test-name")
我得到输出
test#2Dname
虽然我到处搜索(例如 here, here) or even in the RFC standard(据我所知)它总是说连字符不是要转义的字符。
有没有我没有得到的东西,或者这是库的错误?
我的 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 = |
为什么?
在库中,一系列字符声明为'safe',不需要转义。由于某些原因,上述字符已明确排除在 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 明确规定了转义字符,例如:
- a space (' ' U+0020) or number sign ('#' U+0023) occurring at the beginning of the string;
- a space (' ' U+0020) character occurring at the end of the string;
- one of the characters '"', '+', ',', ';', '<', '>', or '\' (U+0022, U+002B, U+002C, U+003B, U+003C, U+003E, or U+005C, respectively);
- the null (U+0000) character.
然而,它接着说:
Other characters may be escaped.
这种含糊不清的陈述表明您可能希望转义任何字符。