2011-08-03 79 views
3

我正在用PHP開發一個Web應用程序,用戶可以擁有自己的帳戶,並且跟蹤用戶的會話存儲在MySQL數據庫中。現在,在搜索關於如何實現這個的答案之後,我發現許多人都喜歡使用session_destroy()並取消設置cookie。爲什麼 - 會不會session_destroy()就足夠了?即使the PHP manual說「爲了完全殺掉會話,就像登錄用戶一樣,會話ID也必須未被設置。」在從PHP會話註銷期間取消設置Cookie的要點是什麼?

我的推理:在用戶註銷並恰好在離開之前再訪問您網站上的另一個頁面後,PHP腳本檢查用戶是否登錄會調用session_start(),設置新會話無論如何都是用戶的cookie。下面是它看起來像:當然

// here we include some scripts and make some instances we'll need 
require_once("database.php"); 
require_once("session.php"); 
$database_connection = new DB_Connection(); 
$session = new Session($database_connection); 

// here a session cookie is sent to a user, even if he or she isn't logged in 
session_start(); 

// finally we check if the user is logged in 
$log_isLogged = false; 
if(isset($_SESSION['member_id'], $_SESSION['username'])){ 
    $log_member_id = $_SESSION['member_id']; 
    $log_username = $_SESSION['username']; 
    $log_isLogged = true; 
} 

,它是當用戶知道這個事實,並離開現場前,一個新的cookie可以被設置好的。但是有些網站甚至會在註銷後直接將您重定向到新頁面,導致創建新的會話cookie - 取消您剛纔的操作。

我的推理是否存在某些方面的缺陷,或者,如果您沒有設置會話cookie,它是否無關緊要? 也許大多數開發人員只是認爲它至少不能傷害它來解決它?

我不是母語的人,所以我提前爲任何錯誤和語法錯誤表示歉意。

回答

6

(命名不明)session_destroy()函數只會將會話中的數據刪除。它不會而不是從瀏覽器中刪除會話cookie並保留與會話關聯的session_id。 session_start()只有在客戶端的請求中沒有提供session_id時纔會向客戶端發出新的session_id。您的代碼容易受到session fixation攻擊,在這種攻擊中,惡意攻擊者將在您的站點上開始會話以獲取有效的session_id,然後誘騙您的站點的毫無防備的用戶使用攻擊者已知的session_id登錄。這可以通過向URL發送受害者與session_id的鏈接(如果你的網站會以這種方式接受)或其他各種方法來完成。一旦受害者登錄,攻擊者也會以同樣的用戶身份登錄。

爲了防止你應該會話固定攻擊:

  1. 成功登錄後,發出了一個全新的session_id到客戶端通過調用session_regenerate_id()

  2. 在註銷時,完全銷燬服務器和客戶端上會話的每個工件。這意味着撥打session_destroy()setcookie()取消設置客戶端Cookie。

  3. 確保您的網站不會公開URL中的session_id或接受URL中提供的session_id。

  4. 請確保您的session_id長且足夠隨機,以至於實際上不會被攻擊者猜出。

  5. 確保您的網站不容易受到cross site scripting攻擊,這將允許攻擊者從已登錄的用戶中竊取有效的session_id。

  6. 確保您的登錄通過https進行,會話cookie被標記爲安全。與會話相關的所有通信都應通過https進行。客戶端的session_id絕不能通過http發送,因爲這會在傳輸過程中暴露它。

更多參考:OWASP Top Ten page on session management

+0

好吧,謝謝你,我會考慮這樣做 - 你知道我怎麼會去阻止這種情況的發生?也許可以在每個網頁瀏覽中更改SID,或者至少在登錄後直接更改SID? – Muuse

+0

我明白1,3,4和5.現在讀完他們後,他們似乎很明顯。但是,我仍然不明白cookie的設置會有多大的不同,只要所有的數據在服務器端被刪除。我的意思是,當不取消cookie設置時,由於session_destroy(),所有數據在服務器端仍然會被銷燬。用戶在瀏覽器中會留下一個SID作爲cookie,當然,但是服務器無法識別的是登錄的。這有什麼害處?我會看看你提供給我的鏈接。非常感謝!! – Muuse

+0

@laph:認爲#2是買二手手機。即使您使用自己的SIM卡,手機的IMEI也會保持不變,並且您的手機流量可以被知道IMEI的人員(例如向您出售手機的人員)捕獲。爲了保證您的會話不會被劫持,您必須更改與會話相關的所有事件,包括其ID。 –