防止LDAP函数的PHP警告

时间:2013-08-16 23:41:11

标签: php ldap warnings suppress-warnings

目前我正在使用ldap_*函数来处理我的某个Web应用程序的身份验证。我有逻辑,能够检查登录是否有效,但是当用户输入无效的用户名/密码组合ldap_bind()产生警告,如果可能,我想避免。目前我正在使用@运算符来抑制此错误,但我很好奇是否有更好的方法来阻止来自ldap_*的警告,而不会完全关闭PHP中的警告或抑制它们。

警告是

  

遇到PHP错误

     

严重性:警告

     

消息:ldap_bind()[function.ldap-bind]:无法绑定到服务器:凭据无效

     

文件名:libraries / userauth.php

     

行号:75

我目前的代码如下:

$uid = "uid=".$username;
$ldapUser = $uid.",ou=***,dc=***,dc=***";
$ds = ldap_connect( $this->ldapURL ); 
$lb = @ldap_bind( $ds, $ldapUser, $password );
$sr = ldap_search( $ds, $this->ldapBaseDN, $uid );
$info = ldap_get_entries( $ds, $sr );

有没有办法在没有完全打开PHP警告或抑制它的情况下阻止此警告?

3 个答案:

答案 0 :(得分:10)

此行为是设计使然,您无法阻止ldap_bind触发无效凭据上的警告。不过你还有一些选择:

  1. 按照您正在执行的@取消警告
  2. Turn all errors into Exceptions,然后抓住它们并妥善处理
  3. 通过修改错误报告级别(非常非常糟糕的想法)忽略警告
  4. 在我自己的ldap库中,我使用@抑制器,但是我听说与将错误转换为Exception相比,这是非常慢的,所以我的建议是使用选项2.如果你没有&#39关注超高性能,然后选项1是一种非常有效的方法。

答案 1 :(得分:1)

另一个非常非常糟糕的想法是使用proc_open('php', ...),将badass PHP代码包含在标准输入中,并评估标准输出。例如,在我的情况下,这是在身份验证失败时逃避ldap_bind异常的唯一方法:

$stdout = null;

$proc = proc_open(
    'php', 
    array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')),
    $pipes
);
if (is_resource($proc)) {
    fwrite($pipes[0], "<?php 
        echo ldap_bind(
            ldap_connect('$ip_ldap_server'), 
            '$ldapUser', 
            '$password' 
        ); 
    ");
    fclose($pipes[0]);

    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($proc);
}

if ($stdout == 1) {
    // authentication is succesfull;
    ...
} else {
    // authentication failed;
    ...
}

非常难看的代码......

修改

所以...我使用此代码的原因是set_error_handler(),但最后我找到了this。 @是你最好的选择。

答案 2 :(得分:0)

您也可以这样:

try {
    $lb = ldap_bind( $ds, $ldapUser, $password );
} catch (\Exception $e) {
    return $e->getMessage();
}