5

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

警告是

遇到 PHP 错误

严重性:警告

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

文件名:库/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 警告或抑制它的情况下阻止此警告?

4

3 回答 3

11

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

  1. @正如你已经在做的那样抑制警告
  2. 将所有错误转化为 Exceptions,然后捕获它们并适当处理
  3. 通过修改错误报告级别来忽略警告(非常非常糟糕的主意)

在我自己的 ldap 库中我使用了@抑制器,但我听说它与将错误转换为异常相比相当慢,所以我的建议是使用选项 2。如果你不关心超高性能,那么选项 1 是一种完全有效的方法。

于 2013-08-18T00:28:44.637 回答
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(),但最后我找到了这个。@ 是你最好的选择。

于 2014-01-28T22:56:37.277 回答
0

你也可以这样做:

try {
    $lb = ldap_bind( $ds, $ldapUser, $password );
} catch (\Exception $e) {
    return $e->getMessage();
}
于 2018-07-10T14:46:47.357 回答