PHP 7.4.25 ldap_search返回[-7] Bad search filter错误排查求助
问题根因
你遇到的[-7] Bad search filter错误核心原因是直接拼接未做LDAP过滤器语法转义的输入值构造查询条件,从数组取出的$InpArry[0]包含破坏过滤器结构的字符,常见分为两类:
- LDAP过滤器保留特殊字符:
(、)、*、\、空字节(NUL),这些字符在LDAP查询语法中有特殊作用,直接拼接会导致过滤器语法解析失败 - 不可见字符:trim()仅能过滤普通ASCII空白、换行、制表符,无法过滤Unicode空白、控制字符,这类不可见字符也会导致过滤器格式异常
另外如果$InpArry[0]取值为空,trim后构造的过滤器会变成(&(sAMAccountName=)),本身就是非法格式,也会触发该报错。
排查步骤
- 先确认变量实际值,在构造过滤器前添加调试代码,输出变量的十六进制内容,避免肉眼看不到不可见字符:
var_dump(bin2hex($username));
- 检查输出结果,确认是否为空、是否包含前面提到的特殊字符对应的十六进制值:
28(对应()、29(对应))、2a(对应*)、5c(对应\)、00(对应空字节)。
修复方案
使用PHP原生ldap_escape()函数对输入值做过滤器场景转义(PHP 5.6及以上版本均支持,兼容你使用的PHP 7.4),修改对应代码段即可:
# Find Manager $username = trim($InpArry[0]); // LDAP过滤器场景转义,自动处理所有特殊字符 $escaped_username = ldap_escape($username, '', LDAP_ESCAPE_FILTER); $filter1 = "(&(sAMAccountName=".$escaped_username."))";
如果需要兼容更低PHP版本,可以手动实现转义逻辑:
function custom_ldap_filter_escape($input) { $search = ['\\', '*', '(', ')', "\x00"]; $replace = ['\5c', '\2a', '\28', '\29', '\00']; return str_replace($search, $replace, $input); }
该处理方式除了解决过滤器格式错误问题,还可以避免LDAP注入安全风险。
内容的提问来源于stack exchange,提问作者James4U
相关产品推荐
相关产品推荐

