ldap_search 将不接受搜索输入中带括号的过滤器

Pea*_*ket 5 php ldap ldap-query

在我正在处理的 php 页面中,建立了 LDAP 连接,从中拉出 cn 条目列表并将其放入下拉列表中。下拉列表中的选择通过表单提交发送到另一个 php 脚本,该脚本根据 LDAP 检查选定的 cn 以获取更多相关信息。

对于大多数名称,这没有问题;however, a cn was recently added that includes parentheses enclosing a nickname, and when that name is selected it causes the ldap_search() method to return false. 下面是代码,其中 $employeename 是经过消毒的员工姓名。

...

$dn = "cn=users,dc=our-domain,dc=com";
$filter = "(cn=".$employeename.")";

$attrs = array("cn", "mail");
$rslt = ldap_search($ldapsvr, $dn, $filter, $attrs);

$entries = ldap_get_entries($ldapsvr, $rslt);

...
Run Code Online (Sandbox Code Playgroud)

$filter 字符串最终为

(cn=First (FN) Last)
Run Code Online (Sandbox Code Playgroud)

其中 First 是名字,Last 是姓氏,FN 是包含的昵称。我曾尝试将括号转义为 \28 和 \29(如提供here,其中还说匹配的括号不需要转义),但没有帮助。有效的名称包括字母、空格和句点(用于中间名首字母)。

(cn=First \28FN\29 Last)
Run Code Online (Sandbox Code Playgroud)

编辑:ldap_search 返回 false,而不是死亡。如果 $rslt 为 false 而不是数组,我在调查时包含的其中一行将失败并死亡。

编辑:我只转义了内括号,。因为外面从来没有给任何麻烦

Mik*_*osh 5

尝试添加操作数作为一种运算顺序。我在现场遇到了类似的问题,title直到我做了类似以下的事情。

$filter = "(&(cn=$employeename))";
Run Code Online (Sandbox Code Playgroud)

在某些系统上,您需要()使用\.

$filter = "(&(cn=James \(Jim\) Doe))";
Run Code Online (Sandbox Code Playgroud)

坚持住,正在研究逃生功能。