2010-11-26 40 views
2

看來最流行的學派是隨機生成會話ID,在用戶登錄時重新生成會話ID,並在現有用戶登錄時定期重新生成會話ID,只是爲了提高安全性。

我正在使用備用解決方案,但我不是一個經驗豐富的PHP專家,我擔心有一個明顯的安全漏洞(或兩個或更多),我可能會錯過。

如果你可以看看下面的內容,告訴我它是如何被破壞的,我會很感激。

該腳本創建一個與用戶機器綁定的會話ID,並始終保持相同。我正在考慮將當前日期包含在散列表中,但我們的夜班工作人員隨後將在午夜退出。不是說我會聽到他們的抱怨;)

我知道,使用IP地址會打開它濫用,如果兩個用戶使用相同的操作系統和瀏覽器坐在咖啡店,使用免費的WiFi,但是這是針對內部MIS的,因此每個用戶都有自己的靜態IP地址。如果他們稍後決定讓它可以通過網絡訪問,我就麻煩了!但這不是規範的一部分:)

// Set the session ID 
$session_hash = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_HOST'] . $_SERVER['REMOTE_ADDR']); 
// Compare against session ID received from user 
if (session_id() != $session_hash) 
{ 
    session_destroy(); 
    unset ($_SESSION); 
    session_id($session_hash); 
    session_start(); 
} 
else 
{ 
    // Attempt to load user details from database if $_SESSION['user_ID'] is set. 
} 

所有建設性意見歡迎和讚賞!

回答

7

我不打擾嘗試創建自己的會話ID。您的方法特別薄弱,因爲在代理服務器的情況下,許多人將共享相同的遠程主機,用戶代理和遠程地址。

使用PHP的內置會話,除非您找到避免它們的特定原因。你沒有表明你有這樣的理由。恰恰相反,正如你所說,這個系統是內部使用的,你家的「增強」會話安全性就更不重要了。

這並不重要,你只會減少PHP已經爲你提供的安全性,試圖推出自己的產品。

+0

還有我以爲我很聰明。我完全明白你的觀點,但認爲PHP的內置會話並不安全。 – Kalessin 2010-11-27 11:33:55

1

內置機制應該適合您的需求。如果你堅持推出你自己的解決方案,我建議在數據結尾附加一段隨機數據。生成這種隨機數據的最佳方法是PHP的openssl_random_pseudo_bytes()-function

2

如果它們都有自己的靜態IP,請將IP存儲在會話中,並在每次加載頁面時進行比較。如果$_SERVER['REMOTE_ADDR'] != $_SESSION['IP'],有人試圖竊取會話。

而且別忘了session_regenerate_id()