2011-05-12 70 views
4

我在php手冊中讀到了關於會話漏洞的問題,並且遇到了這個問題:我需要我的服務器/代碼在成功驗證用戶之後生成會話ID。是我登錄前生成的會話ID嗎?

現在,我不知道什麼時候php設置會話Id。我的PHP應用程序是類似MVC的,一切都通過index.php,並在index.php的頂部我有session.start(),因爲每一個頁面(登錄後)使用會話。

這是一個漏洞風險嗎?或者,我應該這樣說:這是否意味着在我第一次到達我的網站時,即使在登錄之前,服務器是否爲該用戶設置了會話ID? session.start()是否設置了一個用戶ID,或者是一個session-id,直到我設置了我的第一個會話變量,即。直到我做$ _SESSION ['foo'] ='酒吧'?

如果一個會話實際上是在session.start()上產生的,我想一個好主意是在認證後重新生成session-id,這樣做是否能解決問題?

回答

1

或者,我應該這樣說:這是否意味着首次到達我的網站時,即使在登錄之前,服務器是否爲該用戶設置了會話ID?

是的,它的確如此。

我想一個好主意是在驗證後重新生成會話ID,在那種情況下解決問題嗎?

你是對的。

是否session.start()設置用戶ID,或者是不產生會話ID,直到我把我的第一個會話變量...

在任何情況下,再生用戶登錄會話ID本質上你什麼都不花費,即使你沒有爲非登錄用戶設置$_SESSION變量,如果你出於某種原因決定在將來這樣做,你將被覆蓋。

4

會話ID是在運行session_start()時生成的。

最佳做法是使用session_regenerate_id()登錄時刷新會話ID。

4

當調用session_start並且沒有通過有效的會話ID時,PHP會生成一個新的會話ID。所以在你的情況下,用戶在訪問登錄表單頁面時已經獲得會話ID。

這不是一般性的安全漏洞,但可能是您的應用程序容易受到session fixation的影響。爲了避免有some counter-measures。關於認證最重要的是生成一個新的會話ID並使舊的無效。在將用戶信息存儲在會話中之前,您可以通過調用session_regenerate_id來做到這一點:

if ($userIsAuthentic) { 
    session_regenerate_id(true); 
    $_SESSION['user-id'] = 12345; 
    /* … */ 
}