溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php中的session劫持和防范的方法

發(fā)布時間:2021-07-24 13:58:52 來源:億速云 閱讀:178 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“php中的session劫持和防范的方法”,在日常操作中,相信很多人在php中的session劫持和防范的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”php中的session劫持和防范的方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

session 數(shù)據(jù)暴露
會話數(shù)據(jù)常會包含一些個人信息和其它敏感數(shù)據(jù)?;谶@個原因,會話數(shù)據(jù)的暴露是被普遍關(guān)心的問題。一般來說,暴露的范圍不會很大,因?yàn)闀挃?shù)據(jù)是保存在服務(wù)器環(huán)境中的,而不是在數(shù)據(jù)庫或文件系統(tǒng)中。因此,會話數(shù)據(jù)自然不會公開暴露。
使用SSL是一種特別有效的手段,它可以使數(shù)據(jù)在服務(wù)器和客戶端之間傳送時暴露的可能性降到最低。這對于傳送敏感數(shù)據(jù)的應(yīng)用來說非常重要。SSL在HTTP之上提供了一個保護(hù)層,以使所有在HTTP請求和應(yīng)答中的數(shù)據(jù)都得到了保護(hù)。
如果你關(guān)心的是會話數(shù)據(jù)保存區(qū)本身的安全,你可以對會話數(shù)據(jù)進(jìn)行加密,這樣沒有正確的密鑰就無法讀取它的內(nèi)容。這在PHP中非常容易做到,你只要使用session_set_save_handler( )并寫上你自己的session加密存儲和解密讀取的處理函數(shù)即可。
session 劫持
最常見的針對會話的攻擊手段是會話劫持。它是所有攻擊者可以用來訪問其它人的會話的手段的總稱。所有這些手段的第一步都是取得一個合法的會話標(biāo)識來偽裝成合法用戶,因此保證會話標(biāo)識不被泄露非常重要。前面關(guān)于會話暴露和固定的知識能幫助你保證會話標(biāo)識只有服務(wù)器及合法用戶才能知道。
深度防范原則可以用在會話上,當(dāng)會話標(biāo)識不幸被攻擊者知道的情況下,一些不起眼的安全措施也會提供一些保護(hù)。作為一個關(guān)心安全的開發(fā)者,你的目標(biāo)應(yīng)該是使前述的偽裝過程變得更復(fù)雜。記住無論多小的障礙,都會以你的應(yīng)用提供保護(hù)。
把偽裝過程變得更復(fù)雜的關(guān)鍵是加強(qiáng)驗(yàn)證。會話標(biāo)識是驗(yàn)證的首要方法,同時你可以用其它數(shù)據(jù)來補(bǔ)充它。你可以用的所有數(shù)據(jù)只是在每個HTTP請求中的數(shù)據(jù):
GET / HTTP/1.1
Host: example.org
User-Agent: Firefox/1.0
Accept: text/html, image/png, image/jpeg, image/gif, */*
Cookie: PHPSESSID=1234
你應(yīng)該意識到請求的一致性,并把不一致的行為認(rèn)為是可疑行為。例如,雖然User-Agent(發(fā)出本請求的瀏覽器類型)頭部是可選的,但是只要是發(fā)出該頭部的瀏覽器通常都不會變化它的值。如果你一個擁有1234的會話標(biāo)識的用戶在登錄后一直用Mozilla Firfox瀏覽器,突然轉(zhuǎn)換成了IE,這就比較可疑了。例如,此時你可以用要求輸入密碼方式來減輕風(fēng)險,同時在誤報時,這也對合法用戶產(chǎn)生的沖擊也比較小。你可以用下面的代碼來檢測User-Agent的一致性:

復(fù)制代碼 代碼如下:


<?php
session_start();
if (isset($_SESSION['HTTP_USER_AGENT']))
{
 if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
 {
    /* Prompt for password */
    exit;
 }
}
else
{
 $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}

?>


我觀察過,在某些版本的IE瀏覽器中,用戶正常訪問一個網(wǎng)頁和刷新一個網(wǎng)頁時發(fā)出的Accept頭部信息不同,因此Accept頭部不能用來判斷一致性。
確保User-Agent頭部信息一致的確是有效的,但如果會話標(biāo)識通過cookie傳遞(推薦方式),有道理認(rèn)為,如果攻擊者能取得會話標(biāo)識,他同時也能取得其它HTTP頭部。由于cookie暴露與瀏覽器漏洞或跨站腳本漏洞相關(guān),受害者需要訪問攻擊者的網(wǎng)站并暴露所有頭部信息。所有攻擊者要做的只是重建頭部以防止任何對頭部信息一致性的檢查。
比較好的方法是產(chǎn)生在URL中傳遞一個標(biāo)記,可以認(rèn)為這是第二種驗(yàn)證的形式(雖然更弱)。使用這個方法需要進(jìn)行一些編程工作,PHP中沒有相應(yīng)的功能。例如,假設(shè)標(biāo)記保存在$token中,你需要把它包含在所有你的應(yīng)用的內(nèi)部鏈接中:

復(fù)制代碼 代碼如下:


<?php
$url = array();
$html = array();
$url['token'] = rawurlencode($token);
$html['token'] = htmlentities($url['token'], ENT_QUOTES, 'UTF-8');
?>

<a href="index.php?token=<?php echo $html['token']; ?>">Click Here</a>


為了更方便地管理這個傳遞過程,你可能會把整個請求串放在一個變量中。你可以把這個變量附加到所有鏈接后面,這樣即便你一開始沒有使用該技巧,今后還是可以很方便地對你的代碼作出變化。
該標(biāo)記需要包含不可預(yù)測的內(nèi)容,即便是在攻擊者知道了受害者瀏覽器發(fā)出的HTTP頭部的全部信息也不行。一種方法是生成一個隨機(jī)串作為標(biāo)記:

復(fù)制代碼 代碼如下:


<?php
$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';
$token = md5($string);
$_SESSION['token'] = $token;
?>


當(dāng)你使用隨機(jī)串時(如SHIFLETT),對它進(jìn)行預(yù)測是不現(xiàn)實(shí)的。此時,捕獲標(biāo)記將比預(yù)測標(biāo)記更為方便,通過在URL中傳遞標(biāo)記和在cookie中傳遞會話標(biāo)識,攻擊時需要同時抓取它們二者。這樣除非攻擊者能夠察看受害者發(fā)往你的應(yīng)用所有的HTTP請求原始信息才可以,因?yàn)樵谶@種情況下所有內(nèi)容都暴露了。這種攻擊方式實(shí)現(xiàn)起來非常困難(所以很罕見),要防止它需要使用SSL。
有專家警告不要依賴于檢查User-Agent的一致性。這是因?yàn)榉?wù)器群集中的HTTP代理服務(wù)器會對User-Agent進(jìn)行編輯,而本群集中的多個代理服務(wù)器在編輯該值時可能會不一致。如果你不希望依賴于檢查User-Agent的一致性。你可以生成一個隨機(jī)的標(biāo)記:

復(fù)制代碼 代碼如下:


<?php
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
?>


這一方法的安全性雖然是弱一些,但它更可靠。上面的兩個方法都對防止會話劫持提供了強(qiáng)有力的手段。你需要做的是在安全性和可靠性之間作出平衡。

到此,關(guān)于“php中的session劫持和防范的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI