此LDAP筛选器数据包有什么问题?
我正在尝试移植一个程序,该程序从Perl到Go查询LDAP服务器,在Go版本中,我收到一个响应,表明过滤器的格式不正确: 00000057:ldaper:DSID-0C00968,注释:服务器无法解码搜索请求筛选器,数据0,v1db1\x00 我使用tcpdump捕获了用Perl和Go版本的程序传输到服务器的数据,发现它们发送的过滤包略有不同。这个问题不是关于Go程序中任何可能的错误,而是关于理解LDAP筛选器数据包的内容 编码的过滤器是:此LDAP筛选器数据包有什么问题?,ldap,Ldap,我正在尝试移植一个程序,该程序从Perl到Go查询LDAP服务器,在Go版本中,我收到一个响应,表明过滤器的格式不正确: 00000057:ldaper:DSID-0C00968,注释:服务器无法解码搜索请求筛选器,数据0,v1db1\x00 我使用tcpdump捕获了用Perl和Go版本的程序传输到服务器的数据,发现它们发送的过滤包略有不同。这个问题不是关于Go程序中任何可能的错误,而是关于理解LDAP筛选器数据包的内容 编码的过滤器是: (objectClass=*) Perl生成的数据包
(objectClass=*)
Perl生成的数据包(服务器喜欢)如下所示:
ASCII . . o b j e c t C l a s s
Hex 87 0b 6f 62 6a 65 63 74 43 6c 61 73 73
Byte# 0 1 2 3 4 5 6 7 8 9 10 11 12
ASCII . . . . o b j e c t C l a s s
Hex a7 0d 04 0b 6f 62 6a 65 63 74 43 6c 61 73 73
Byte# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Go生成的数据包(服务器不喜欢)如下所示:
ASCII . . o b j e c t C l a s s
Hex 87 0b 6f 62 6a 65 63 74 43 6c 61 73 73
Byte# 0 1 2 3 4 5 6 7 8 9 10 11 12
ASCII . . . . o b j e c t C l a s s
Hex a7 0d 04 0b 6f 62 6a 65 63 74 43 6c 61 73 73
Byte# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
这是我自己的数据包分类:
- 字节0:标记
当我从两个数据包中剖析字节0时,我看到它们是相同的,除了基本体/构造位,它在Perl版本中设置为基本体,在Go版本中构造。有关详细信息,请参阅
Bit# 87 6 54321 Perl 10 0 00111 Go 10 1 00111
- 位87:在两个数据包中,10=
- 第6位:在Perl版本0=原语中,在Go版本1=原语中
- 位54321:00111=7=
- 字节1:长度 Perl版本为11字节,Go版本为13字节
- Go版本的字节2-3
- 字节2:标记04:子字符串过滤器(见第节)
- 字节3:长度为11字节
- 剩余:有效载荷
对于这两个数据包,这只是ASCII文本
objectClass
Wireshark能够解析这两个数据包,并对它们进行同等解释。Perl版本正确,而Go版本不正确 正如您所指出的,RFC 4511第4.5.1节规定了过滤器元件的编码,如:
Filter ::= CHOICE {
and [0] SET SIZE (1..MAX) OF filter Filter,
or [1] SET SIZE (1..MAX) OF filter Filter,
not [2] Filter,
equalityMatch [3] AttributeValueAssertion,
substrings [4] SubstringFilter,
greaterOrEqual [5] AttributeValueAssertion,
lessOrEqual [6] AttributeValueAssertion,
present [7] AttributeDescription,
approxMatch [8] AttributeValueAssertion,
extensibleMatch [9] MatchingRuleAssertion,
... }
在这种情况下,相关部分是:
present [7] AttributeDescription,
AttributeDescription元素在同一规范的第4.1.4节中定义:
AttributeDescription ::= LDAPString
-- Constrained to <attributedescription>
-- [RFC4512]
这意味着当前的过滤器组件是一个八位字符串,它是一个基本元素。Go错误地将其转换为构造元素,目录服务器正确地拒绝了该格式错误的请求。感谢您的解释。很明显,我走的是正确的道路,但你帮助我更好地理解了这一点。