2013-03-14 69 views
0

我有一個(我想不會這麼少見)場景:PHP:堅持LDAP連接跨請求

我的PHP應用程序查詢LDAP服務器來處理身份驗證。 LDAP服務器只接受認證訪問,所以第一個ldap_bind()調用實際上用作認證機制並檢索登錄用戶的基本信息。

到目前爲止這麼好。但是當我想使用LDAP服務來執行其他查詢時(例如登錄用戶或其他用戶的額外信息),我必須再次通過LDAP身份驗證。

不要想要在會話中存儲用戶的密碼,因爲它可能會泄漏,但我不能讓用戶在每個請求上進行身份驗證,以便爲LDAP服務器提供憑據。

所以我想到了以下解決方案:

  1. 商店LDAP連接手柄會議,所以我不必提供憑據每次。這是行不通的,因爲句柄是一個資源,無法序列化爲會話存儲。
  2. 在會話中存儲密碼,但加密。加密種子可以來自一些易變的變種,例如,會話ID的散列,以便它不會被存儲在var中,並且永遠不會泄漏。
  3. <Your idea here>

有什麼想法?

感謝

回答

1

我的兩分錢...首先使用情況下,我認爲可避免拉低一切爲了用戶,你第一次連接。在會話中存儲它的全部減去密碼。第二種情況:您是否需要以用戶X的身份進行身份驗證才能訪問該數據?您是否可以不創建具有讀取訪問權限的用戶,並使用這些憑據(應用用戶)來查詢這些類型的內容。或者,也許這個用戶信息不應該存在於AD中。使用它進行身份驗證,但將用戶數據保存在DB(主站)中,或者同步到AD(從站)的DB中。

+0

不幸的是我沒有對LDAP服務器的控制。 對於第一種情況你是對的,但最重要的用途是獲取其他用戶的信息,因此無法緩存。 – 2013-03-14 19:58:39

+0

如果是這樣的話,你是否看過將[RADIUS](http://freeradius.org/)添加到組合中?可能有一些現有的解決方案使用[EAP](http://en.wikipedia.org/wiki/Extensible_Authentication_Protocol),這將緩解您對密碼在應用程序中的安全性的擔憂。 ref:http://freeradius.org/features/eap.html – ficuscr 2013-03-14 20:07:14

0

至於存儲密碼,這是工作(使用Yii框架,但它很容易適應香草PHP):

public function getUserPW(){ 
    if(empty(Yii::app()->user->sneak)) return false; 

    $seed=sha1(Yii::app()->session->sessionID); 
    $iv=substr(md5(Yii::app()->session->sessionID),0,16); 

    return openssl_decrypt(Yii::app()->user->sneak,self::CRYPT_ALGO,$seed,false,$iv); 
} 

public function setUserPW($pw){ 
    $seed=sha1(Yii::app()->session->sessionID); 
    $iv=substr(md5(Yii::app()->session->sessionID),0,16); 

    Yii::app()->user->setState('sneak', 
     openssl_encrypt($pw,self::CRYPT_ALGO,$seed,false,$iv) 
    ); 
}