博客遷移:時空螞蟻http://cui.zhbor.com/php
由於有相同的session id包含在請求的Cookie頭部中,因此相同的php session將會被訪問到。可是,請求裏的User-Agent頭部跟先前的請求中的信息是不一樣的,系統是否能夠假定這兩個請求是同一個用戶發出的?算法
像這種狀況下,發現瀏覽器的頭部改變了,可是不能確定這是不是一次來自攻擊者的請求的話,比較好的措施就是彈出一個要求輸入密碼的輸入框讓用戶輸入,這樣的話,對用戶體驗的影響不會很大,又能頗有效地防止攻擊。瀏覽器
固然,你能夠在系統中加入覈查User-Agent頭部的代碼,相似Listing 3中的代碼:安全
<?php session_start(); if (md5($_SERVER['HTTP_USER_AGENT']) != $_SESSION['HTTP_USER_AGENT']) { /* 彈出密碼輸入框 */ exit; } /* Rest of Code */ ?>
固然,你先必須在第一次請求時,初始化session的時候,用MD5算法加密user agent信息而且保存在session中,相似下面listing4中的代碼:cookie
<?php session_start(); $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); ?>
雖然不必定須要用MD5來加密這個User-Agent信息,但使用這種方式之後就不須要再過濾這個$_SERVER['HTTP_USER_AGENT']數據了。否則的話,在使用這個數據之前必需要進行數據過濾,由於任何來自客戶端的數據都是不可信任的,必需要注意這一點。session
在你檢查這個User-Agent客戶端頭部信息之後,作爲一個攻擊者必需要完成兩步才能劫持一個session:ui
獲取一個合法的session id加密
包含一個相同的User-Agent頭部在僞造的請求中spa
你可能會說,竟然攻擊者能得到有效的session id,那麼以他的水平,僞造一個相同的User-Agent不是件難事。不錯,可是咱們能夠說這至少給他添加了一些麻煩,在必定程度上也增長了session機制的安全性。設計
你應該也能想到了,既然咱們能夠檢查User-Agent這個頭部來增強安全性,那麼不妨再利用其它的一些頭部信息,把他們組合起來生成一個加密的token,而且讓客戶端在後續的請求中攜帶這個token!這樣的話,攻擊者基本上不可能猜想出這樣一個token是怎麼生成出來的。這比如你用信用卡在超市付款,一個你必須有信用卡(比如session id),另外你也必須輸入一個支付密碼(比如token),這有這二者都符合的狀況下,你才能成功進入帳號付款。 看下面一段代碼:
<?php session_start(); $token = 'SHIFLETT' . $_SERVER['HTTP_USER_AGENT']; $_SESSION['token'] = md5($token . session_id()); ?>
注意:Accept這個頭部不該該被用來生成token,由於有些瀏覽器會自動改變這個頭部,當用戶刷新瀏覽器的時候。
在你的驗證機制中加入了這個很是難於猜想出來的token之後,安全性會獲得很大的提高。假如這個token經過像session id同樣的方式來進行傳遞,這種狀況下,一個攻擊者必須完成必要的3步來劫持用戶的session:
獲取一個合法的session ID
在請求中加入相同的User-Agent頭部,用與生成token
在請求中攜帶被攻擊者的token
這裏面有個問題。若是session id以及token都是經過GET數據來傳遞的話,那麼對於能獲取session ID的攻擊者,一樣就可以獲取到這個token。因此,比較安全靠譜的方式應該是利用兩種不一樣的數據傳遞方式來分別傳遞session id以及token。例如,經過cookie來傳遞session id,而後經過GET數據來傳遞token。所以,假如攻擊者經過某種手段得到了這個惟一的用戶身份標識,也是不太可能同時輕鬆地獲取到這個token,它相對來講依然是安全的。
還有不少的技術手段能夠用來增強你的session機制的安全性。但願你在大體瞭解session的內部本質之後,能夠設計出適合你的應用系統的驗證機制,從而大大的提升系統的安全性。畢竟,你是最熟悉當下你開發的系統的開發者之一,能夠根據實際狀況來實施一些特有的,額外的安全措施。
以上只是大概地描述了session的工做機制,以及簡單地闡述了一些安全措施。但要記住,以上的方法都是可以增強安全性,不是說可以徹底保護你的系統,但願讀者本身再去調研相關內容。在這個調研過程當中,相信你會學到頗有實際使用價值的方案。