2013-08-16 12 views
5

Obecnie używam funkcji ldap_* do obsługi uwierzytelniania dla jednej z moich aplikacji internetowych. Mam logikę, która jest w stanie sprawdzić, czy login jest poprawny, który działa poprawnie, jednak gdy użytkownik wprowadzi niepoprawną kombinację nazwy użytkownika/hasła, ldap_bind() generuje ostrzeżenie, którego chciałbym uniknąć, jeśli to możliwe. W tej chwili tłumiam ten błąd za pomocą operatora @, ale jestem ciekawy, czy istnieje lepszy sposób blokowania ostrzeżeń przed ldap_* bez całkowitego wyłączenia ostrzeżeń w PHP lub ich wyłączenia.Zapobieganie ostrzeżeniom PHP na funkcjach LDAP

Ostrzeżenie jest

php wystąpił błąd

ważności: ostrzeżenie

wiadomości: ldap_bind() [function.ldap-wiążą] Nie można przypisać do serwera: Nieprawidłowe poświadczenia

Nazwa pliku: libraries/userauth.php

Line Number: 75

Mój bieżący kod wygląda następująco:

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

Czy istnieje jakiś sposób, aby zapobiec tego ostrzeżenia bez włączania ostrzeżeń PHP całkowicie lub tłumiąc go?

Odpowiedz

9

To zachowanie jest zgodne z projektem, nie można zapobiec wywołaniu przez ldap_bind ostrzeżenia dotyczącego nieprawidłowych poświadczeń. Nadal masz kilka opcji, ale:

  1. Wyłącza ostrzeżenie z @ jak już robisz
  2. Turn all errors into Exceptions, a następnie je złapać i obsługiwać odpowiednio
  3. ignorowanie ostrzeżeń modyfikując poziom raportowania błędów (bardzo, bardzo zły pomysł)

W moim biblioteki ldap używam @ tłumik, ale słyszałem, że jest to dość powolny w porównaniu do konwersji błąd w wyjątek, więc moja propozycja jest taka, aby przejść z opcji 2. jeśli nie "t Dbając o super-wysoką wydajność, opcja 1 jest całkowicie poprawnym podejściem.

+0

Z jakiegoś powodu @ nie blokuje ostrzeżenia w moim systemie. – Matt

1

Innym bardzo, bardzo brzydkim pomysłem jest użycie proc_open('php', ...), włączenie złego kodu PHP do standardowego wejścia i ocenę standardowego wyjścia. Na przykład, w moim przypadku był to jedyny sposób, aby uniknąć ldap_bind wyjątki, gdy autoryzacja nie powiodła się:

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

Bardzo brzydki kod ...

EDIT

Więc ... powodem, dla którego użyłem tego kodu był set_error_handler(), ale w końcu znalazłem this. @ Jest twoim najlepszym wyborem.