2013-08-16 35 views
5

目前我正在使用ldap_*函數來處理我的一個Web應用程序的身份驗證。我有邏輯能夠檢查登錄是否有效,但是當用戶輸入一個無效的用戶名/密碼組合ldap_bind()會產生一個警告,如果可能,我會盡量避免。目前,我正在使用@運算符來抑制此錯誤,但我很好奇,是否有更好的方法來阻止來自ldap_*的警告,而不必完全關閉PHP中的警告或將其禁止。預防LDAP函數的PHP警告

該警告是

甲PHP錯誤遇到

嚴重性:警告

消息:的ldap_bind()[function.ldap綁定]:無法綁定到服務器:無效憑證

文件名:庫/ 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警告的轉彎或抑制它?

回答

9

此行爲是有意設計的,您無法防止ldap_bind在無效憑據上觸發警告。你仍然有一些選擇,但:

  1. 禁止與@警告,你已經在做
  2. Turn all errors into Exceptions,然後抓住他們,並妥善處理
  3. 通過修改錯誤報告級別(非常非常忽略警告壞主意)

在我自己的LDAP庫我用的是@抑制,但我聽說,這是相對於轉換錯誤到異常很慢,所以我的建議是去與選項2,如果你不「T關心超高性能,那麼選項1是非常有效的方法。

+0

出於某種原因,@不會在我的系統上禁止警告。 – Matt

1

另一個非常非常糟糕的想法是使用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。 @是你最好的選擇。

相關問題