2012-08-07 66 views
3

我已經編寫了一個應用程序,用戶通過LDAP進行身份驗證和登錄。這真的很好,我只是用他們的憑證做一個ldap_bind(),如果它是真的,那麼驗證他們 - 否則,告訴他們把它吊起來。我可以將他們的用戶名保留在會話變量中,以便我知道他們是誰。存儲LDAP連接並在會話中綁定

現在,應用程序的一部分需要用戶搜索LDAP來查找其他用戶。我已經使用jquery-autocompleteldap_search()來實現這一點,並且它工作得很好 - 用戶只需鍵入用戶名,名字或姓氏,並且建議所有可能的匹配。可愛:)

但是,企業IT甚至不允許匿名瀏覽網絡中的目錄,所以,現在,我將用戶名和密碼存儲在$_SESSION中,以便我可以在每次執行新綁定時自動完成腳本被調用。我知道這是相當安全,並且該工具只是內部的,但這感覺就像我不應該做的事情,如果它被「放到外面」肯定不會做。

我想要做的是在登錄時創建綁定到LDAP,然後以某種方式在整個會話期間記住此認證,所以我們可以根據需要執行儘可能多的搜索,而無需重新進行身份驗證每一次。我無法訪問服務器,因此我無法更改任何內容。我可以以某種方式存儲$_SESSION中的成功綁定並重新使用它嗎?

如果這不是相對直接的,有沒有人有任何其他的建議,如何可以實施?

+0

安全註釋:'如果的ldap_bind()''返回的TRUE'密碼爲空,您的LDAP服務器配置爲接受匿名身份驗證。因此,請確保您轉義特殊字符,然後檢查「長度> 0」。 – Adi 2012-08-07 15:23:51

回答

0
  • 到符合LDAP服務器的初始連接是匿名
  • 成功綁定請求改變連接
  • 一個不成功的BIND請求的認證狀態(或具有零長度DN和密碼綁定請求)將身份驗證狀態重置爲匿名。

因此,一旦連接被認證,並且直到處理成功的BIND請求,連接保持其認證狀態。這意味着連接可以保持打開並且在連接上傳輸操作,直到服務器或客戶端關閉連接。

請注意,符合LDAP的服務器可以選擇發送不是對客戶端請求的響應的未經請求的通知。現代的,專業品質的服務器將使用這種機制來通知客戶端,無論出於何種原因,服務器正在關閉連接。

總之,請保持連接並繼續使用它。更好的是,建立到服務器的連接的認證池。

更新:

到符合LDAP的服務器的連接可保持打開,並且可以用於許多交易(請求 - 響應對)作爲客戶端的慾望(和服務器許可證)。 LDAP允許每個連接有多個事務,並且還允許異步連接。

+2

你的意思是說,這可以跨不同的頁面加載? – periklis 2012-08-07 14:33:55

0

無法序列化資源類型(這是ldap_connect()返回的內容)。

我們在類似場合所做的,是使用只對LDAP樹(和特定類型的數據,如姓名,姓氏,電子郵件),並沒有別的搜索權限的特定LDAP帳戶。此用戶的帳戶憑證存儲在數據庫中。

也許應用安全的第二級,你可以允許這個用戶只能從特定IP(我認爲LDAP服務器都支持這一點,但我不是100%確定)進行連接。因此,即使證書被攻破,他們幾乎沒用

+0

你可能會扼殺這個專用用戶來阻止DOS攻擊嗎? – Will 2012-08-07 15:06:41

+0

@這樣做肯定會是明智的,特別是如果連接到特定的IP是不可能的,那麼好點。 – periklis 2012-08-07 15:08:28