2009-06-23 62 views
3

問題:下載鏈接應顯示在用戶的主頁中。 該下載鏈接應該只能在用戶登錄時訪問。如何驗證跨服務器的用戶會話?

但真正的問題是用戶的主頁和下載鏈接位於不同的Web服務器上。

有沒有一種方法我可以發送下載鏈接令牌並驗證它呢?

+0

顯示你的嘗試,在這裏複製相關的代碼。 – 2009-06-23 11:34:34

+0

可能的重複:http:// stackoverflow。com/questions/580671/configure-session-to-work-on-application-that-deployed-multiple-server – Gumbo 2009-06-23 11:42:13

回答

0

如果用戶點擊鏈接,他將從他的服務器到您的服務器。

而且,如果他記錄在您的服務器上,那麼你可以做任何檢查你需要,因爲他正試圖訪問服務器上的文件。即使鏈接顯示在其他某個服務器上。

這就是說,如果您使用會話來保持用戶登錄,那麼在下載代碼中應該足夠用session_start()開始會話,並且用戶應該已經登錄了會話。

1
users server = serverA.com 
your server = serverB.org 

如果我的理解對不對,問題是,用戶只登錄服務器A,但不能在服務器B,而且也沒有辦法共享會話狀態(例如會話處理轉移數據庫)?

從我的頭頂,我能想到的一個選項:

服務器B只是要求服務器A
手段:在serverA鏈接包含用戶會話ID *。然後服務器B詢問服務器A會話是否有效。

如果沒有這兩臺服務器之間的通信,就無法做到這一點。

*注:不是會話ID倒不如使用隨機令牌。會議ID不應該是私人的。

不會停止你的用戶分享的網址,因此,如果他們想讓別人來下載文件,他們可以簡單地繞過URL。另一方面,惡意用戶也可以通過他的session-id做到這一點。

1

你可以讓下載鏈接提交一個帶有用戶信息的表單到目標服務器。這樣做會帶來安全隱患,因爲登錄信息將作爲隱藏表單字段的值出現在頁面的源代碼中,因此可能不是您想要的方式。

第二個選擇是將存儲在數據庫中的會話信息,然後簡單地傳遞會話密鑰到新的服務器。這需要第二臺服務器能夠聯繫第一臺服務器的數據庫並對其運行查詢。設置具有從該服務器登錄以進行讀取訪問的權限的用戶名應足以完成此操作,而不會打開許多​​安全漏洞。

最後,你可以設置第一臺服務器上的Web服務得到一個用戶名時,將返回一個是/否的答案,驗證登錄用戶的身份。然後,第二臺服務器上的接收鏈接將獲取用戶名並在構建響應之前驗證登錄狀態。