【问题标题】:Preventing PHP Warnings on LDAP Functions防止 LDAP 函数上的 PHP 警告
【发布时间】:2013-08-19 11:11:36
【问题描述】:

目前我正在使用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 警告或禁止它的情况下阻止此警告?

【问题讨论】:

    标签: php ldap warnings suppress-warnings


    【解决方案1】:

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

    1. 使用 @ 抑制警告,就像您已经在做的那样
    2. Turn all errors into Exceptions,然后抓住他们并妥善处理
    3. 通过修改错误报告级别来忽略警告(非常非常糟糕的主意)

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

    【讨论】:

    • 由于某种原因,@ 不会抑制我系统上的警告。
    【解决方案2】:

    另一个非常非常非常糟糕的想法是使用proc_open('php', ...),将糟糕的 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。 @ 是您最好的选择。

    【讨论】:

      【解决方案3】:

      你也可以这样做:

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

      【讨论】:

      • 欢迎提供简短的回答,但是对于试图了解问题背后原因的后者用户而言,它不会提供太多价值。请抽出一些时间来解释导致问题的真正问题是什么以及如何解决。谢谢~
      猜你喜欢
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2016-09-13
      相关资源
      最近更新 更多