PHP 會話固定和劫持:預防和緩解
會話固定
發生會話固定當攻擊者故意為使用者設定會話標識符時。這削弱了會話的安全性,因為攻擊者可以使用預先定義的標識符來冒充使用者。若要防止會話固定:
-
停用 URL 中的會話傳輸: 在 php.ini 中將 session.use_trans_sid 設為 0。
-
限制Cookie會話儲存: 將session.use_only_cookies 設定為1 中php.ini.
-
重新產生會話ID:每當會話狀態更改(例如登入後)時,呼叫session_regenerate_id(true)。
會話劫持
會話劫持是以下行為獲取有效的會話標識符並使用它作為原始用戶發送請求。雖然直接防止會話劫持是不可能的,但有幾個措施可以使其變得更加困難:
-
強哈希:將session.hash_function 設定為強演算法,如php 中的SHA256 或SHA512。 ini.
-
增加雜湊位:設定session.hash_bits_per_character 為 5,讓猜測會話 ID 更具挑戰性。
-
熵包含: 將 session.entropy_file 設定為 /dev/urandom 並將 session.entropy_length 設為 a,將熵加入會話 ID適當的數量。
-
自訂會話名稱: 使用 session_name() 變更預設 PHPSESSID 的會話名稱。
-
輪替:定期輪替會話 ID 以減少攻擊者的會話持續時間。
- 用戶代理檢查:包括用戶的瀏覽器代理($_SERVER['HTTP_USER_AGENT']) 在會話中並在後續請求中檢查它。
-
IP 位址追蹤: 將使用者的 IP 位址 ($_SERVER['REMOTE_ADDR']) 儲存在會話並依照後續要求進行檢查。
-
令牌比較:產生令牌對於會話和瀏覽器端。遞增並比較每個請求的令牌。
會話重新產生
使用 session_regenerate_id(true) 重新產生會話 ID 也會使舊會話資料無效。因此,當會話狀態發生變化時,此操作就足夠了。
徹底的會話銷毀
結束會話時,使用destroySession() 而不是session_destroy() 徹底銷毀刪除瀏覽器和伺服器上的所有痕跡:
function destroySession() {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params['path'], $params['domain'],
$params['secure'], $params['httponly']
);
session_destroy();
}
登入後複製
以上是如何防止 PHP 會話固定和劫持?的詳細內容。更多資訊請關注PHP中文網其他相關文章!