2011-09-22 24 views
0

對於標題的奇怪的遞歸措辭,抱歉,我想不出一個更好的標題。 正如我之前提到的,我有2個網站A和B,並且我將B集成到A中,因此B仍然可以作爲獨立站點訪問,但也可以作爲A(在iframe中)的一部分訪問。兩個網站都有他們的登錄屏幕。當我從A訪問它時,我需要繞過B站點的登錄屏幕。我完成了這一步,如下所示:如何確保正確的用戶在網站被某個網站呼叫時登錄

首先A檢查B的位置是否與a相同(即它們在服務器上運行),如果這是真的,那麼登錄信息存儲在會話變量中並在b上檢查。

如果B的位置是不同的服務器,那麼通過url發送登錄信息(請參閱:I need to integrate two sites, what's the best way to carry over login information?),這可能是不安全的,因爲該URL可以在源代碼中看到,但我couldn沒有想到更好的解決方案。

當網站B被調用時,index.php被調用,並且index.php檢查用戶是否登錄(是否設置了會話變量),如果沒有用戶被授權,index.php調用check.php檢查站點a發送的認證數據。如果數據是好的,check.php驗證用戶,一旦腳本結束,我們回到index.php。

現在,唯一的問題是,如果用戶ADMIN登錄到網站a,然後單擊網站鏈接b,網站b顯示,他現在在兩個網站上以管理員身份登錄。做了一些事情後,ADMIN從站點A註銷,而不註銷站點b。然後,他的老闆SUPER ADMIN走過去,推開他的座位並登錄到現場a。然後,超級管理員點擊到站點b的鏈接,只是發現他以ADMIN身份登錄到站點b。此時,他拿起電話,打電話給我,然後繼續對我說褻瀆。

所以,這不是最嚴重的問題,但它很好解決。我想到的一個解決方案是爲網站a的每個用戶添加一個網站b id字段,並將其發送到網址中。所以,當調用check.php時,它將id字段存儲在SESSION變量中。所以,當網站a再次調用index.php時,它會檢查Session變量是否已設置,如果是,則將設置變量與由$ _GET發送的新變量進行比較。如果URL不同,它會破壞會話,幷包含checks.php,我可以實現這個解決方案,但它需要一些工作,我不確定這是不是一個好主意,所以我想要詢問是否還有其他更好的方法,或者提供上述解決方案的提示。

感謝您的時間,祝您有美好的一天!

回答

1

使服務器與彼此進行通信。當用戶想要通過站點A訪問站點B時,首先將他發送到服務器A.服務器A在將用戶重定向到具有新創建的登錄令牌的站點B之前,直接與服務器B協商某種類型的登錄令牌。服務器到服務器之間的通信並不是那麼容易被攔截的,所以你可以用純文本的方式發送用戶信息,但是如果你覺得它是必要的,你也可以加密這個通信。

當SUPER ADMIN到達時,他會得到一個新的登錄令牌,告訴服務器B終止活動會話並登錄新用戶。

這不是超級安全的,但它很簡單,應該工作不夠好,這種情況下...

+0

有趣的,呃,對不起,這聽起來很傻,但我如何才能互相通信的服務器?在中,有沒有一個PHP函數可以讓你發送和接收令牌? – zermy

+0

你可以使用php的文件處理函數。例如'file_get_contents'。像這樣:'$ token = file_get_contents('http://www.server-b.com/token.php?user=ADMIN');'token。然後,服務器B上的php應該檢查請求的IP地址,如果它是服務器A,它可以創建一個令牌並用'echo $ token;'將其寫回服務器A;' –

+0

令牌的性質將影響安全性這種方法。理想情況下,你應該有一個包含用戶信息,令牌和超時信息的db表。令牌通常應該幾乎立即使用,所以超時可能很低。如果數據庫不是一個選項,你可以使用基於時間的哈希結合uuid,如你的例子。鹽的時間部分可能是當前時間四捨五入到最接近的分鐘。當登錄請求到來時,服務器必須檢查當前時間和前一分鐘,使有效超時在一分鐘到兩分鐘之間。 –