ldap_connect() php 中的函数接受任何值并且不会抛出错误

ldap_connect() function in php accepts any value and doesnt throw an error

我正在编写一个 php 代码来连接到我的 LDAP 服务器。

$adServer = $ini['ldap'];
$ldap = ldap_connect($adServer) or die("Could not connect to {$adServer}");

$adServer 的值我正在从配置文件中获取。

当我传递空白值或任何其他随机值(如 "Hello")时,看起来 ldap_connect() 没有抛出错误。

我尝试给出以下代码来检查是否生成了任何错误消息。

echo ldap_error($ldap)

它总是说 'Success'。

因此我无法验证连接是否已建立到 LDAP 服务器并抛出相应的错误消息。

在什么情况下 'die' 会触发 ldap_connect() 函数。 如果配置文件中提供的服务器名称不起作用,我想向最终用户抛出适当的错误消息。

注意:PHP

我使用的是 5.6 版

ldap_connect() 当它可以将提供的参数解析为 URL 时,总是 returns 资源。第一次实际使用该资源(因此建立连接并检测到可能的故障)是在使用 ldap_bind() 时。

作为 ldap_connect() 几乎总是 returns 一个资源句柄(如 http://php.net/ldap_connect 中所述)你的构造 die()不会做你想做的事。只有当提供的参数不能在内部解析为 URL 时,它才会起作用。所以只要您提供一个 看起来 像服务器名或 URL 的字符串,一切正常。

我总是在失败后检查 ldap_bind() 究竟发生了什么,然后根据 返回的错误抛出异常。或者,我有时会在使用 ldap_bind() 之前进行检查,方法是使用 f.i fsockopen() 打开(并关闭)连接。如果无法打开该连接,则 ldap 连接也将不起作用。

所引用的 php 文档中的示例具有误导性,看来我们必须更改它们。因此,感谢您发现并提出问题!

顺便说一句:例如,调用 @ldap_connect('ldap:');die() 可以工作的情况,因为它是一个不完整的 URL。或者使用带空格的字符串。

我找到了一种比使用模具更好的身份验证方法。 在 ldap connect 之后,我们将继续使用 ldap bind。如果绑定失败,那么我们可以检查 ldap 错误。

$ldap = @ldap_connect($adServer);
$bind = @ldap_bind ($ldap, $ldaprdn, $password);
if (!$bind) {  // If Bind Failed then.
    if (ldap_errno ($ldap) == 49 {
        //Invalid Credentials
    } else {
    //LDAP Connection to LDAP Server Failed
    }
}

有关所有 LDAP 错误编号的列表,您可以查看 here