2009-06-08 126 views
1

因此,我正在嘗試編寫一個PHP SOAP客戶端,該客戶端需要用戶爲遠程SOAP服務器傳遞其登錄憑證。這是設置/困境:通過PHP保持登錄憑據服務器端(安全和安全)

  • 用戶使用本地憑證登錄到本地站點,並轉到使用SOAP客戶端的頁面。
  • 用戶現在被提示輸入遠程Soap服務器的憑證,順便說一下,它與用於通過POST表單訪問本地站點(10次中的9次)的憑證相同。
  • 客戶端傳遞SOAP頭中的憑證以及SOAP請求,客戶端輸出SOAP服務器響應。
  • 腳本結束,用戶看到輸出數據。

現在用戶想要一些與原始輸出相關的其他數據位。問題是,$ _POST變量現在已經消失了。用戶必須包含憑證以及下一個請求。重複,直到用戶決定通過另一種方法查找數據變得更容易,並放棄使用酷的SOAP客戶端。

託管Web服務的服務器可以通過Web客戶端直接訪問,並通過cookie維護身份驗證。但是,當通過WDSL查詢服務器時,它不會查找任何Cookie或其他瀏覽器端會話;它只是檢查SOAP請求是否包含頭中的憑證。

所以有這個問題的兩個版本:

1)是否有本地會話憑據獲得通過的SOAP請求,從而保持登錄到一個辦法? (請注意,即使在本地,我也無法控制身份驗證方法,這是通過本地化的Apache mod進行處理的,該mod可以控制整個系統中任何用戶的身份驗證,涵蓋了幾十個我沒有管轄權的部門。我查看了全局變量,並沒有看到任何證書提示,但我可能會對PHP/Apache的一些基本安全特性有所da漏)。

2)有沒有一種安全可靠的方式讓PHP在二級登錄後處理憑據,以便這些憑證可以使用一段時間(比如30分鐘的會話?)。請記住,根據第一點,這些憑據是非常機密的,因此,應該沒有簡單的方法讓某人捅過來並獲得這些憑據以回顯(或進入某些數據庫以查看它們等)。

對不起,如果這聽起來偏執。我不習慣處理安全憑證,除了一個簡單的「這是你放入密碼的地方......好,現在每個人都可以在會話的其餘時間彼此瞭解,我可以回到輸出有用的東西。」

即使鏈接到任何基本的安全功能將是一個有益的開始。

回答

4

創建您自己的過期會話。創建一個數據庫表:

CREATE TABLE session (
    ID int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    Hash binary(16) NOT NULL, 
    User int unsigned NOT NULL, 
    Created timestamp 
); 

當用戶第一次驗證時,創建會話並返回Hash的十六進制形式。

後續調用不需要用戶名和密碼,只需要散列。比如說,5分鐘不活動後,哈希將被刪除。用戶名和密碼只傳遞一次,之後使用散列作爲認證,並在一段時間不使用後過期。

0

爲什麼不自己設置一個cookie,在第一次soap請求之後有一個用戶名/密碼?你問一次然後存儲在一個cookie中。然後,您可以設置超時時間並在用戶登錄時查詢它。您可能希望在註銷時刪除該cookie。

該cookie只包含soap用戶/密碼。這樣您就不必擔心有人在服務器上戳動並找到其他憑據。這與用戶每次輸入它的效果相同,因爲它始終以明文形式發送。您可以使用可逆哈希或簡單的雙向加密來混淆cookie中的用戶名和密碼。

+0

實際上,我在PHP會話安全在讀了起來: http://phpsec.org/projects/guide/4.html 我最關心的是,密碼是相當多的其他相同敏感數據,我需要確保沒有人可以解碼cookie或攔截會話。即使我很有可能使用某種密碼並反轉密碼並阻止訪問解密方法的任何http方式,但仍然會有代碼,如果有人能夠訪問服務器,則會繪製路線圖獲取密碼。 – Anthony 2009-06-08 23:19:11