5

在我正在处理的 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);

...

$filter 字符串以

(cn=First (FN) Last)

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

(cn=First \28FN\29 Last)

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

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

4

2 回答 2

3

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

$filter = "(&(cn=$employeename))";

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

$filter = "(&(cn=James \(Jim\) Doe))";

紧紧抓住,处理逃生功能。

于 2012-07-20T15:29:34.853 回答
0

Parentheses must be escaped in search filter assertion values. See also: rfc4515 (section 4).

于 2012-07-20T17:11:25.757 回答