我应该如何转义 ldap 特殊字符?
How should I escape ldap special characters?
我正在使用 python-ldap 查询 Active Directory
我有这个 DN
CN=Whalen\, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net
作为查询的基础,它工作得很好,但如果我尝试在这样的搜索过滤器中使用它
(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalen\, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))
我收到 Bad search filter
错误。从我的测试来看,CN 中的逗号似乎是罪魁祸首,尽管我用反斜杠 (\
) 将其转义。但是,Microsoft documentation 中没有将逗号列为需要在过滤器中转义的字符。
我错过了什么?
LDAP 过滤器规范为以下字符分配了特殊含义 * ( ) \ NUL
,在搜索过滤器中使用时,这些字符应使用反斜杠后跟字符 的两个字符 ASCII 十六进制表示形式进行转义 (rfc2254) :
* A
(
)
\ C
Nul [=10=]
这意味着任何用于转义 可分辨名称' 特殊字符(包括逗号)的反斜杠必须在搜索过滤器中由 c
表示:
(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalenc, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))
这是在搜索过滤器中使用时必须使用 \
或 C
转义的 dn 特殊字符列表:
+-------------------------------+---+
| comma | , |
+-------------------------------+---+
| Backslash character | \ |
+-------------------------------+---+
| Pound sign (hash sign) | # |
+-------------------------------+---+
| Plus sign | + |
+-------------------------------+---+
| Less than symbol | < |
+-------------------------------+---+
| Greater than symbol | > |
+-------------------------------+---+
| Semicolon | ; |
+-------------------------------+---+
| Double quote (quotation mark) | " |
+-------------------------------+---+
| Equal sign | = |
+-------------------------------+---+
| Leading or trailing spaces | |
+-------------------------------+---+
我在使用带有转义字符的 member:1.2.840.113556.1.4.1941
进行搜索时遇到了非常奇怪的行为。
搜索词转义时好像搜索失败'properly',但搜索词不转义时搜索成功!
相比之下,使用 member
的普通搜索无论搜索词是否转义都有效。
这是一个 PowerShell 示例。
function Find-AdObjects([string]$Filter) {
$DirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher
$DirectorySearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry
$DirectorySearcher.SearchScope = [System.DirectoryServices.SearchScope]::Subtree
$DirectorySearcher.PropertiesToLoad.Add('distinguishedname') > $null
$DirectorySearcher.PageSize = 100
$DirectorySearcher.Filter = $Filter
$SearchResultCollection = $DirectorySearcher.FindAll()
foreach ($r in $SearchResultCollection) {
$r.Properties['distinguishedname']
}
$SearchResultCollection.Dispose()
$DirectorySearcher.Dispose()
}
$UserDn = 'CN=Rees\, John,OU=Tier3,DC=big,DC=com'
$EscapedUserDn = 'CN=ReesC, John,OU=Tier3,DC=big,DC=com'
# Returns expected results with escaped search term
Find-AdObjects "(&(member=$EscapedUserDn))"
# Returns same results even though search term is NOT escaped correctly
Find-AdObjects "(&(member=$UserDn))"
# Returns NO results even though search term is escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$EscapedUserDn))"
# Returns recursive results even though search term is NOT escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$UserDn))"
所以我没有看到可接受的解决方法,因为似乎没有可靠的方法来转义可能包含各种特殊字符的 DN:\*()
我正在使用 python-ldap 查询 Active Directory
我有这个 DN
CN=Whalen\, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net
作为查询的基础,它工作得很好,但如果我尝试在这样的搜索过滤器中使用它
(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalen\, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))
我收到 Bad search filter
错误。从我的测试来看,CN 中的逗号似乎是罪魁祸首,尽管我用反斜杠 (\
) 将其转义。但是,Microsoft documentation 中没有将逗号列为需要在过滤器中转义的字符。
我错过了什么?
LDAP 过滤器规范为以下字符分配了特殊含义 * ( ) \ NUL
,在搜索过滤器中使用时,这些字符应使用反斜杠后跟字符 的两个字符 ASCII 十六进制表示形式进行转义 (rfc2254) :
* A
(
)
\ C
Nul [=10=]
这意味着任何用于转义 可分辨名称' 特殊字符(包括逗号)的反斜杠必须在搜索过滤器中由 c
表示:
(&(objectClass=group)(memberof:1.2.840.113556.1.4.1941:=CN=Whalenc, Sean,OU=Users,OU=Users and Groups,DC=example,DC=net))
这是在搜索过滤器中使用时必须使用 \
或 C
转义的 dn 特殊字符列表:
+-------------------------------+---+
| comma | , |
+-------------------------------+---+
| Backslash character | \ |
+-------------------------------+---+
| Pound sign (hash sign) | # |
+-------------------------------+---+
| Plus sign | + |
+-------------------------------+---+
| Less than symbol | < |
+-------------------------------+---+
| Greater than symbol | > |
+-------------------------------+---+
| Semicolon | ; |
+-------------------------------+---+
| Double quote (quotation mark) | " |
+-------------------------------+---+
| Equal sign | = |
+-------------------------------+---+
| Leading or trailing spaces | |
+-------------------------------+---+
我在使用带有转义字符的 member:1.2.840.113556.1.4.1941
进行搜索时遇到了非常奇怪的行为。
搜索词转义时好像搜索失败'properly',但搜索词不转义时搜索成功!
相比之下,使用 member
的普通搜索无论搜索词是否转义都有效。
这是一个 PowerShell 示例。
function Find-AdObjects([string]$Filter) {
$DirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher
$DirectorySearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry
$DirectorySearcher.SearchScope = [System.DirectoryServices.SearchScope]::Subtree
$DirectorySearcher.PropertiesToLoad.Add('distinguishedname') > $null
$DirectorySearcher.PageSize = 100
$DirectorySearcher.Filter = $Filter
$SearchResultCollection = $DirectorySearcher.FindAll()
foreach ($r in $SearchResultCollection) {
$r.Properties['distinguishedname']
}
$SearchResultCollection.Dispose()
$DirectorySearcher.Dispose()
}
$UserDn = 'CN=Rees\, John,OU=Tier3,DC=big,DC=com'
$EscapedUserDn = 'CN=ReesC, John,OU=Tier3,DC=big,DC=com'
# Returns expected results with escaped search term
Find-AdObjects "(&(member=$EscapedUserDn))"
# Returns same results even though search term is NOT escaped correctly
Find-AdObjects "(&(member=$UserDn))"
# Returns NO results even though search term is escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$EscapedUserDn))"
# Returns recursive results even though search term is NOT escaped correctly
Find-AdObjects "(&(member:1.2.840.113556.1.4.1941:=$UserDn))"
所以我没有看到可接受的解决方法,因为似乎没有可靠的方法来转义可能包含各种特殊字符的 DN:\*()