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

时间:2015-08-18 11:40:03

标签: php ldap ldapconnection

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

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

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

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

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

echo ldap_error($ldap)

它总是说成功'

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

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

注意:我使用的是5.6版本的PHP

2 个答案:

答案 0 :(得分:1)

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

由于ldap_connect() 几乎总是返回资源句柄(如http://php.net/ldap_connect中所述),您的die()构造将无法执行您想要的操作。只有在内部无法将提供的参数解析为URL时,它才会起作用。因此,只要您提供外观的字符串,如服务器名称或URL,一切正常。

我总是在不成功ldap_bind()之后检查发生了什么,然后根据返回的错误抛出异常。或者,我有时会在使用ldap_bind()之前通过使用f.i fsockopen()打开(并关闭)连接来检查。如果无法打开该连接,则ldap-connection也将无效。

关于引用的php文档的示例是误导性的,似乎我们将不得不改变它们。所以感谢发现和抛出问题!

BTW:例如,调用@ldap_connect('ldap:');会导致die()工作,因为它是一个不完整的URL。或者使用带有空格的字符串。

答案 1 :(得分:0)

我找到了一种更好的方法来进行身份验证而不是使用死亡。 在ldap连接之后,我们将继续使用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