2013-10-16 75 views
-1

我有以下幾點:如何禁止匿名ldap登錄?

class LDAPConnection { 

    private $ldapServers = array(
     "ldap://serv1", "ldap://serv2" 
    ); 
    private $ldapUsername = "DOMAIN\\%s"; 

    function login($username, $password) { 
     $user = sprintf($this->ldapUsername, $username); 
     // Make sure password is not empty (http://stackoverflow.com/a/172042/561731) 
     if(!empty($password)) { 
      foreach($this->ldapServers as $server) { 
       try { 
        $ldap = \ldap_connect($server); 
        \ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); 
        if($bind = \ldap_bind($ldap, $user, $password)) { 
         // log them in 
         return true; 
        } 
       } 
       catch(\ErrorException $e) { 
        // do nothing 
       } 
      } 
     } 
     return false; 
    } 
} 

正如你可以看到我首先要確保的$password不是空的話,我嘗試LDAP連接,因爲如果我不這樣做,那麼LDAP假設我想做一個匿名連接並返回true

我該如何預防?是我唯一的選擇,像我上面做的,我必須檢查到請確保密碼不是空的?或者,還有更好的方法?

+1

這有什麼錯檢查'$ password'是不是空的?看起來像非常基本的驗證。只是拋出一個異常。 – ceejayoz

+0

@ceejayoz這似乎是一個額外的事情,可能不需要,如果有一個'ldap_ *'函數爲你做。 – Neal

+1

我懷疑有一個'ldap_ *'函數來完成它時,它是一個簡單的'如果($密碼)'...尤其是結合W/O密碼在技術上是合法的。 – ceejayoz

回答

1

禁止匿名登錄不應該在你的應用層來完成。它應該在實際的LDAP服務器本身完成。

在應用程序層禁止匿名登錄我看起來像一個創可貼,因爲任何人都可以隨時使用任何LDAP客戶端,如果匿名登錄的服務器本身上啓用登錄到您的LDAP服務器。

+0

它絕對是一個創可貼。你可能會認爲所有的組織都把他們的王國的鑰匙給他們的開發者。如果是這樣,你是錯誤的。像我這樣的人 - 在一個大型官僚機構工作的人 - 必須編寫像這樣所有frikkin時間的變通辦法。完成最小的更改可能需要幾個月的時間,如果有的話。 – DinoAmino