我正在尝试使用远程LDAP服务器。出于安全考虑,我试图仅使用安全连接。我能够得到一些代码但我不确定,如果启动TLS本身的PHP文档,如果以下代码仅适用于安全通道。有人可以帮忙吗?
$is_valid_user = FALSE;
try {
$ds = ldap_connect('ldap.foo.com', 389);
if (! ldap_set_option($ds, LDAP_OPT_REFERRALS, 0)) {
return "";
}
if (! ldap_start_tls($ds)) {
return "";
}
} catch(Exception $e) {
return "";
}
if (! ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
$error = "LDAP Server protocol error.";
return "";
}
try {
$bnd = @ldap_bind($ds, 'uid='.$user.', ou=people, dc=ldap, dc=foo, dc=com' , $passwd);
if ($bnd) {
$is_valid_user = TRUE;
$srch=ldap_search($ds, 'dc=ldap, dc=foo, dc=com', "uid=$user");
$info=ldap_get_entries($ds, $srch);
$userdn=$info[0]["dn"];
$usernm=$info[0]["cn"][0];
return $usernm;
} else {
return "";
}
} catch(Exception $e) {
return "";
}
答案 0 :(得分:1)
以下几项一般性改进。是的,除非通过TLS加密连接,否则它的编写方式将无法继续。 LDAP模块此刻不会抛出任何异常,因此不需要try / catch块。很难说没有看到你的其余代码,但有没有理由要返回一个空字符串而不是false
或null
或某种错误信息?
$is_valid_user = false;
$ds = ldap_connect('ldap.foo.com', 389);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
if (!@ldap_start_tls($ds)) {
return "";
}
$bindUser = 'uid='.ldap_escape($user, null, LDAP_ESCAPE_DN).',ou=people,dc=ldap,dc=foo,dc=com';
if (@ldap_bind($ds, $bindUser , $passwd)) {
$is_valid_user = true;
$srch = ldap_search($ds, $bindUser, '(objectClass=*)', ['cn']);
$info = ldap_get_entries($ds, $srch);
$userdn = $info[0]["dn"];
$usernm = $info[0]["cn"][0];
return $usernm;
} else {
return "";
}