3

我正在尝试使用LDAPObject.search_s()搜索过滤器。

当我有一个没有 s 的参数时,这工作得很好,但是当过滤器中存在()a 时,这会失败。()

例如,当我寻找一个组时

"(name=(Test Group))", aldap.FILTER_ERROR会出现,但是当我"(name=Test Group)"用作过滤器时,不会有任何问题。

如何搜索有括号的组?

参考:

http://www.python-ldap.org/doc/html/ldap.html?highlight=initialize#ldap-objects

4

2 回答 2

8

您应该使用 ldap.filter 模块。它已经包含了需要转义的所有规则。

>>> import ldap.filter
>>> ldap.filter.filter_format('(cn=%s)', ['(Test Group)',])
'(cn=\\28Test Group\\29)'
于 2014-03-12T21:19:46.400 回答
1

[ RFC4515的第 3 节][1] 说必须对括号 (括号) 和其他特殊字符进行转义。

该规则确保整个过滤器字符串是有效的 UTF-8 字符串,并提供表示 ASCII 字符“*”(ASCII 0x2a)、“(”(ASCII 0x28)、“)”(ASCII 0x29)、“ " (ASCII 0x5c) 和 NUL (ASCII 0x00) 表示为反斜杠 "" (ASCII 0x5c),后跟表示编码八位字节值的两个十六进制数字。

Python 使编码变得容易。只需使用反斜杠 ( \) 转义特殊字符即可。搜索名为“测试组”的组,您的搜索过滤器将是:

'(cn=\(test group\))'

(使用带有 OpenLDAP 服务器的 python-ldap 版本 2.4.10 进行测试)[1]:https ://www.rfc-editor.org/rfc/rfc4515

于 2013-06-19T02:50:28.010 回答