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

时间:2012-07-20 15:23:13

标签: php ldap ldap-query

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

对于大多数名字来说这没问题;但是,最近添加了一个包含括号的括号,当选择该名称时,它会导致ldap_search()方法返回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(如提供的here,其中它也表示匹配的括号不需要转义),但它没有帮助。有效的名称包括字母,间隔和句点(中间名首字母)。

(cn=First \28FN\29 Last)

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

编辑:我只逃脱了内部括号。因为外在从来没有给任何麻烦

2 个答案:

答案 0 :(得分:2)

尝试将操作数添加为一种操作顺序。我在title字段上遇到了类似的问题,直到我做了类似的事情。

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

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

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

紧紧抓住逃生功能。

答案 1 :(得分:0)

必须在搜索过滤器断言值中转义括号。另见:rfc4515(第4节)。