2017-07-26 122 views
0

我目前正在學習PHP,並提出了一個關於Sessions的問題。在發佈這篇文章之前,我已經閱讀了一些關於這個主題的信息和主題,例如this one,但其中大部分都有點老了,所以我想確保我以正確的方式處理它們。PHP - 會話安全性和可靠性

所以,這裏是我的問題:假設下面的項目是真實的,

  • 登錄時,我使用session_regenerate_id()再生PHP會話ID;
  • 登錄時,我創建與encripted代碼(即結合用戶的IP,瀏覽器,並在開始和結束一些隨機的東西),會話變量

$_SESSION['check'] = hash('ripemd128', $rand1 . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $rand2)

將該值發送到數據庫,並在每個頁面中檢查數據庫上的值是否與$_SESSION['check']變量匹配;

  • 我強制用戶通過ini_set('session.use_only_cookies', 1)啓用cookie,並且ini_set('session.use_trans_sid', 0)也被設置;
  • ,退出時,我使用下面的代碼:

$_SESSION = array(); setcookie(session_name(), '', time()-259200, '/'); session_unset(); session_destroy();

這種方式,並假設投入會話變量的值是否正確驗證,我可以在我的會話變量相信100%?如果不是,我可以改進/改變什麼以使它們更安全?

我之所以問這個問題,是因爲當用戶登錄時,我將一些信息保存到會話變量中以避免用查詢重載數據庫,所以我需要確保它們不會被破壞。

謝謝。

+2

你只是問你是否正確處理它們?如果是這樣的話,這可能更多地屬於[CodeReview](https://codereview.stackexchange.com/) – GrumpyCrouton

+0

由於存儲和管理服務器端,會話變量通常可以被信任。然而,很多問題已經涵蓋了SO的相同主題,所以做一些研究。 – Devon

+0

哈希不是「encripted」值。 – deceze

回答

0

整個舞蹈和歌曲與哈希(而不是「encripting」!)用戶代理和IP與一些隨機值是多餘的。在每次請求中,我也沒有看到它在困擾數據庫的問題上。

這有什麼好處,你想要防止什麼?如果有的話,你想防止會話劫持。我們來仔細看一下:

  • 會話劫持意味着一箇中間人或其他第三方能夠竊取用戶的會話cookie。您可以通過HTTPS簡單地阻止這種情況,這是您唯一可以做的事情。
  • 如果用戶計算機上的某些惡意軟件偷走了Cookie而不是MitM,HTTPS不起作用。在這種情況下,攻擊者可能會完全坐在別處。在這種情況下,檢查IP會有所幫助。檢查用戶代理在很大程度上是多餘的,因爲它很容易被模仿。
  • 要檢查IP,您只需將IP直接存儲在會話中並執行簡單的if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']);哈希不會爲該進程添加任何內容。
  • 請注意,IP可能會突然合法更改,這會使登錄無效。
  • 請注意,能夠竊取某人的cookie的惡意軟件可能會從他們自己的計算機中冒充用戶權限,在這種情況下,任何檢查都不會執行任何操作。

底線:任何類型的額外檢查和保護都是無用的。如果您使用的是HTTPS並且有人是仍然能夠劫持會話,那麼您大多數都是SOL。不要打擾。如果您未使用HTTPS,請立即使用它現在

+0

感謝您的反饋意見。是的,我確實想要防止會話劫持。我目前沒有HTTPS,這就是爲什麼我試圖用更多的「檢查」來彌補它,但我會盡快使用它。關於問題的第二部分,我是否可以相信用戶將無法處理放入會話變量中的信息(如果該信息之前已被正確驗證,並且沒有任何允許用戶與會話變量交互)? –

+0

是的,用戶無法更改服務器端會話中的任何信息(除非您編寫代碼)。 – deceze

+0

這就是我需要知道的。再次感謝! –