DN解析需用ldap_str2dn()状态机而非split或正则,因其能正确处理,、+等转义及多值RDN;解析后须双重循环遍历RDN与AVA,用bv_len而非strlen取值;UTF-8值需确保输入合法且后续API指定CP_UTF8。

DN 字符串里为什么 \ 和 + 会破坏解析逻辑
LDAP 的 DN 是结构化字符串,但不是标准的 URI 或 JSON——它用逗号 , 分隔 RDN(Relative Distinguished Name),用等号 = 分隔属性名与值,而值中允许出现逗号、等号、反斜杠甚至空格,这时就必须转义。常见错误是把 DN 当成简单 CSV 处理,直接按 , 切分,结果在 CN=John, Doe,OU=Eng+Admin,DC=example,DC=com 这类字符串上崩掉:第一个 , 表示字面逗号,不该切;+ 同理,+ 在 RDN 中是多值分隔符(如 CN=John+SN=Doe),但被转义后就只是普通加号。
真正安全的做法是逐字符状态机解析,而非正则或 split。libldap 自带的 ldap_str2dn() 就是这么做的——它识别转义序列(xx 十六进制或单字符转义)、引号包围的值("CN=foo, bar")、以及括号嵌套(极少见但合法)。
-
ldap_str2dn()是唯一被 OpenLDAP 官方保证能处理所有 RFC 4514 合法变体的 C 接口,包括空格前导/尾随、双引号包裹、十六进制转义