2015-11-03 62 views
1

我有一個Web應用程序,我打算給每個客戶端自己的子域,如client1.myapp.com,client2.myapp.com等。當用戶登錄時,我將它們存儲會話變量中的用戶標識,如$_SESSION['user'] = 4;當設置了$_SESSION['user']時,用戶已登錄並可以訪問該應用程序。由於用戶ID在每個客戶端中都是唯一的,因此我需要一種方法來防止用戶訪問其他客戶端的子域。我考慮過使用會話cookie,但後來我發現cookies可能會被黑客入侵。現在我正在考慮爲每個客戶端分配一個唯一的客戶端ID,並使用$_SESSION[$clientID]['user']而不是$_SESSION['user']。這是解決問題的安全方法嗎?我還有什麼其他選擇?如何限制用戶到他們的子域

回答

1

您的$clientID方法沒有任何問題。

如果你想要看起來,你可以做一些事情,如使用session_set_cookie_params,所以同樣的PHPSESSID cookie可以被所有的域和子域訪問。這有其好處,特別是如果您的中央登錄頁面需要檢測用戶是否登錄了特定域或子域。或者,如果您希望允許用戶同時從所有子域註銷,或者您想創建可訪問所有子域的管理帳戶。

由於所有子域的會話在服務器上的同一目錄中都是stored,所以即使Cookie綁定到特定的子域,也不要相信正在發送的會話標識。
一個解決方案可能是這樣的:ini_set(session.save_path, "/path/to/your/folder/$clientid")然後你會有一個專用於每個客戶端存儲會話的唯一目錄。這種方法的好處是您的$_SESSION不會包含與另一個子域相關的信息。

您還可以利用sesssion_name而不是PHPSESSID您可以使用client1或client2來清除會話屬於哪個客戶端。 例如client2=8d72edf35377a27388cb;client8=b47277bc8e3d4a5f
然後PHP可以讀取這個cookie並知道會話存在的客戶端。

你也可以使用上述所有的組合,無論你爲什麼工作。
在此處查看會話相關功能:http://php.net/manual/en/book.session.php
此處的會話相關設置:http://php.net/manual/en/session.configuration.php

1

嘗試類似這樣的東西。我希望這將有所幫助。

當用戶登錄時,存儲其子域,如會話變量:

$_SESSION['user_subdomain'] = 'client1.myapp.com'; 

$_SESSION['user']$_SESSION['user_subdomain']設置,用戶登錄並訪問應用程序然後就檢查當前訪問應用程序的子域等於或者不是$_SESSION['user_subdomain']

通過使用這種方式,您可以將客戶端重定向到其正確應用程序的子域,如果他試圖訪問其他客戶端的子域。通過這種方式,您可以阻止用戶訪問其他客戶的子域。

相關問題