在Python LDAP的搜索中使用括号

时间:2013-06-19 00:00:39

标签: python ldap

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

当我有一个没有()的参数时,这非常正常,但是当过滤器中存在()时,这会失败。

例如,当我查找

组时

"(name=(Test Group))",会引发ldap.FILTER_ERROR,但当我使用"(name=Test Group)"作为过滤器时,就没有问题。

如何搜索有parens的群组?

  

参考:

     

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

2 个答案:

答案 0 :(得分:8)

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

>>> import ldap.filter
>>> ldap.filter.filter_format('(cn=%s)', ['(Test Group)',])
'(cn=\\28Test Group\\29)'

答案 1 :(得分:1)

Section 3 of RFC4515表示必须转义括号(parenthèses)和其他特殊字符。

  

规则确保整个过滤字符串是有效的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测试)