此LDAP筛选器数据包有什么问题?

此LDAP筛选器数据包有什么问题?,ldap,Ldap,我正在尝试移植一个程序,该程序从Perl到Go查询LDAP服务器,在Go版本中,我收到一个响应,表明过滤器的格式不正确: 00000057:ldaper:DSID-0C00968,注释:服务器无法解码搜索请求筛选器,数据0,v1db1\x00 我使用tcpdump捕获了用Perl和Go版本的程序传输到服务器的数据,发现它们发送的过滤包略有不同。这个问题不是关于Go程序中任何可能的错误,而是关于理解LDAP筛选器数据包的内容 编码的过滤器是: (objectClass=*) Perl生成的数据包

我正在尝试移植一个程序,该程序从Perl到Go查询LDAP服务器,在Go版本中,我收到一个响应,表明过滤器的格式不正确:

00000057:ldaper:DSID-0C00968,注释:服务器无法解码搜索请求筛选器,数据0,v1db1\x00

我使用tcpdump捕获了用Perl和Go版本的程序传输到服务器的数据,发现它们发送的过滤包略有不同。这个问题不是关于Go程序中任何可能的错误,而是关于理解LDAP筛选器数据包的内容

编码的过滤器是:

(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

我对的阅读表明Go版本“更”正确,而Perl版本是与服务器一起工作的版本。有什么好处


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错误地将其转换为构造元素,目录服务器正确地拒绝了该格式错误的请求。

感谢您的解释。很明显,我走的是正确的道路,但你帮助我更好地理解了这一点。