2010-02-10 74 views
3

我正在實現與單個數據庫交談的多個域的登錄和註冊 - 我們將其稱爲i.domain-a.comi.domain-b.com。這兩個子域在DNS中都有A記錄指向單個服務器 - 因此使i.domain-a.com/hello.phpi.domain-b.com/hello.php運行相同的事情。相同的服務器,不同的域需要不同的會話

因此,如果我在域A上創建會話,那麼我可以轉到域B並檢索相同的會話信息。爲了實現完全獨立的登錄系統,這兩個登錄系統使用我寫過的相同的PHP函數來處理註冊,我應該使用基於$_SERVER['HTTP_HOST']session_name()做些什麼?我不確定我的情況與this guy有多相似,並希望這個問題不太相似。

+0

我想,除此之外,我應該問:如果使用的是不同的'會話名稱()'爲每個域是不是一個明智的選擇,那麼什麼是處理的最佳方式? – 2010-02-10 13:16:06

+0

您還可以在每個域的php應用程序的第一行中設置「session.cookie_domain」[type:string]運行時指令(init_set())(我的回答如下,但使用了對session_name()函數的調用) – Andreas 2010-02-10 13:50:10

回答

2

爲避免會話出現問題,您應使用session_name('myapplication')[session_name({UNIQUE_APP_ID})]。

您提到的問題可能出現在更簡單的情況下,其中有一個管理面板和網站用戶的登錄表單。

如果未使用session_name,則登錄用戶可以訪問管理員。面板但這取決於身份驗證。您已實施的方案和機制

問候,

0

否。阻止不同用戶獲得相同會話的機制以每個服務器爲基礎,而不是以每個主機名爲基礎。

+0

因此,考慮到這一點,在session_start()之前執行'session_name($ _ SERVER ['HTTP_HOST']);'爲同一服務器上的每個域分隔會話是否安全? – 2010-02-10 13:20:42

+0

我也意識到,執行上述操作會導致每次訪問都會生成一個新ID,這並不理想。我需要相同的ID,直到會話過期或被銷燬。對於這種快速回複道歉... – 2010-02-10 13:25:55

2

會話/ Cookie是域特定的,不依賴於DNS設置。如果您希望兩個系統的會話在獨立域中生活時分開,那麼您已經全部設置好了。

我相信session_name()實際上是其他人的問題的最佳解決方案,兩個單獨的會話在同一個域。

+0

謝謝。如果我去'i.domain-a.com/session.php'和'i.domain-a.com/session.php',我有一個調試頁面,該頁面現在只顯示會話ID看到同樣的事情。如果我在session_start()之前執行session_name($ _ SERVER ['HTTP_HOST']);'然後我爲每個域獲得不同的ID。 – 2010-02-10 13:18:59

+0

這是因爲i.domain-a.com/session.php和i.domain-a.com/session.php是相同的頁面。 – Quentin 2010-02-10 13:26:04

+0

會話ID是特定於服務器的,但Cookie是域特定的。用戶的Cookie(每個域一個)將分別指向唯一的會話ID,從而避免任何重疊。嘗試設置一個設置會話變量的腳本和一個顯示該變量的腳本。從一個域運行第一個域,從另一個域運行第二個域,第二個應該永遠不會獲得第一個值,直到它從同一個域運行爲止。 – nortron 2010-02-10 13:28:11

相關問題