在我正在处理的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是假的而不是数组,我在调查时包含的其中一行将会失败并死亡。
编辑:我只逃脱了内部括号。因为外在从来没有给任何麻烦答案 0 :(得分:2)
尝试将操作数添加为一种操作顺序。我在title
字段上遇到了类似的问题,直到我做了类似的事情。
$filter = "(&(cn=$employeename))";
在某些系统上,您需要使用()
转义\
。
$filter = "(&(cn=James \(Jim\) Doe))";
紧紧抓住逃生功能。
答案 1 :(得分:0)
必须在搜索过滤器断言值中转义括号。另见:rfc4515(第4节)。