python - LDAP 过滤器语法
问题描述
我正在使用 python 库 ldap3 向服务器发送请求,以查询未禁用且具有包含用户输入的显示名称或电子邮件的用户对象:
query = "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(displayName={0}*)(mail={0}*))".format(value)
我遵循了我认为文档中有关形成 LDAP 过滤器的内容,但我收到了不正确的 LDAP 过滤器错误消息:
LDAPInvalidFilterError: malformed filter
我玩过它,这很有效:
query = "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(displayName={0}*))".format(value)
我还没有能够构建一个过滤器使用|
。应该如何构造查询?
解决方案
您不能简单地.format()
将任何值放入过滤器。
在将某些字符插入字符串之前,您需要对其进行转义。
* -> \2a ( -> \28 ) -> \29 \ -> \5c 空 -> \00 / -> \2f
就像使用 URL 一样,您可以使用上述方案自由转义您喜欢的任何字符,但以上是最低限度的。
我无法使用 | 构建过滤器 然而。应该如何构造查询?
话虽这么说,你有一个嵌套错误。格式化查询时会看到它:
(& (对象类=用户) (!(userAccountControl:1.2.840.113556.1.4.803:=2)) (| (显示名称={0}*) (邮件={0}*) )
您仍然需要转义value
,但由于 LDAP 服务器不在乎,请保持查询格式:
value = ldap3.utils.conv.escape_filter_chars(user_input)
query = f"""
(&
(objectClass=user)
(!(userAccountControl:1.2.840.113556.1.4.803:=2))
(|
(displayName={value}*)
(mail={value}*)
)
)
"""
推荐阅读
- php - 如何在php中获取两个日期的差异并将该差异添加到第三个日期以获得另一个新日期?
- javascript - Javascript 函数对象(从函数对象内部的函数调用属性)
- ios - 增加可点击的 Textfield() 大小
- javascript - 我怎样才能使这个 JQuery 代码更具响应性?
- java - 返回一个列表
在java中 - azure - Azure LogicApp 是否支持 WebDav 连接?
- python - numpy 日志溢出记录在哪里?
- python - Matplotlib dateformatter 未按要求格式化日期
- reactjs - 在使用 useEffect 挂钩时,我在浏览器上收到此错误
- flutter - 调用 Navigator.of(context).pop() 后如何获取父上下文?