2013-08-16 6 views
5

Derzeit verwende ich die ldap_* Funktionen, um die Authentifizierung für eine meiner Web-Anwendungen zu behandeln. Ich habe Logik, die in der Lage ist zu überprüfen, ob die Anmeldung gültig ist, die funktioniert, aber wenn ein Benutzer eine ungültige Benutzername/Passwort-Kombination eingibt, erzeugt ldap_bind() eine Warnung, die ich möglichst vermeiden möchte. Im Moment unterdrücke ich diesen Fehler mit dem Operator @, aber ich bin gespannt, ob es eine bessere Möglichkeit gibt, Warnungen von ldap_* zu blockieren, ohne die Warnungen in PHP vollständig auszuschalten oder zu unterdrücken.Verhindern von PHP-Warnungen auf LDAP-Funktionen

Die Warnung ist

Ein PHP-Fehler

Severity aufgetreten: Warnung

Nachricht: ldap_bind() [function.ldap-bind]: Kann nicht an den Server binden: Ungültige Anmeldeinformationen

Dateiname: Bibliotheken/userauth.php

Zeilennummer: 75

Mein aktueller Code ist wie folgt:

$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); 

Gibt es eine Möglichkeit, diese Warnung zu verhindern, ohne ganz von PHP Warnungen zu drehen oder es zu unterdrücken?

Antwort

9

Dieses Verhalten ist von Entwurf, Sie können nicht verhindern, dass ldap_bind eine Warnung für ungültige Anmeldeinformationen auslöst. Sie haben noch einige Optionen, aber:

  1. die Warnung mit @ Unterdrückt, wie Sie bereits
  2. Turn all errors into Exceptions tun werden, so dass sie dann abfangen und behandeln entsprechend
  3. Warnungen ignorieren, indem die Fehlerberichterstattung Stufe zu verändern (sehr, sehr schlechte Idee)

In meiner eigenen ldap Bibliothek verwende ich die @ Suppressor, aber ich habe gehört, dass es ziemlich langsam ist im Vergleich zu einem Fehler in Ausnahme Umwandlung, so mein Vorschlag mit der Option 2. Wenn Sie geht, ist don t kümmern sich um Super-High-Performance, dann ist Option 1 ein vollkommen gültiger Ansatz.

+0

Aus irgendeinem Grund unterdrückt das @ die Warnung auf meinem System nicht. – Matt

1

Eine andere sehr sehr, sehr schlechte Idee ist, proc_open('php', ...) zu verwenden, den badass PHP-Code in die Standardeingabe einzuschließen und die Standardausgabe auszuwerten. Zum Beispiel, In meinem Fall war dies der einzige Weg, um die ldap_bind Ausnahmen zu entkommen, wenn die Authentifizierung fehlgeschlagen:

$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; 
    ... 
} 

Sehr hässlicher Code ...

EDIT

So ... die Grund, warum ich diesen Code verwendet habe, war set_error_handler(), aber schließlich fand ich this. Das @ ist deine beste Wette.