PHP调用ldap_bind连接LDAP测试服务器出现connection reset报错
LDAP绑定连接重置问题排查方案
1 核心配置缺失修正(90%概率为该问题)
PHP的LDAP扩展默认使用LDAP v2版本协议,而目前绝大多数公开LDAP服务仅支持v3协议,未显式声明协议版本会导致服务端主动中断连接,触发连接重置报错。需要在ldap_connect之后、ldap_bind之前添加LDAP协议配置代码:
// 必须添加的配置项 ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
2 绑定逻辑合理性校验
你当前代码中写死了绑定DN为cn=read-only-admin,dc=example,dc=com,对应需要输入的密码为该管理员账号的固定密码password,如果你的测试场景是验证普通用户登录,需要将$ldaprdn替换为你注释中给出的用户DN格式:
$ldaprdn = "uid=$username,ou=mathematicians,dc=example,dc=com";
该测试服务下所有普通用户的默认密码均为password,可直接用于测试。
3 环境与网络排查
- 写一个包含
phpinfo()的测试页面,确认LDAP扩展确实处于启用状态,修改php.ini后需要重启XAMPP的Apache服务才会生效 - 本地使用
telnet ldap.forumsys.com 389命令验证网络连通性,确认本地防火墙、出口网络没有拦截389端口的出站请求 - 可添加连接超时配置避免请求挂起导致浏览器断连:
ldap_set_option($ldapconn, LDAP_OPT_NETWORK_TIMEOUT, 10);
修正后完整可运行代码
<?php $username = $_POST['uname']; // 普通用户绑定请用下方DN,管理员绑定保持原有即可 // $ldaprdn = "uid=$username,ou=mathematicians,dc=example,dc=com"; $ldaprdn = "cn=read-only-admin,dc=example,dc=com"; $ldappass = $_POST['psw']; $ldapconn = ldap_connect("ldap://ldap.forumsys.com:389") or die("Could not connect to LDAP server."); if ($ldapconn) { // 新增核心配置 ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); ldap_set_option($ldapconn, LDAP_OPT_NETWORK_TIMEOUT, 10); $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass); if ($ldapbind) { echo "LDAP Bind successful..."; } else { echo "LDAP Bind not successful..."; // 测试阶段可添加错误信息输出排查 echo "错误详情:" . ldap_error($ldapconn); } ldap_unbind($ldapconn); } ?>
内容的提问来源于stack exchange,提问作者dagonsts
相关产品推荐
相关产品推荐

