1. 程式人生 > >PHP安全程式設計:session劫持的防禦

PHP安全程式設計:session劫持的防禦

session 資料暴露

會話資料常會包含一些個人資訊和其它敏感資料。基於這個原因,會話資料的暴露是被普遍關心的問題。一般來說,暴露的範圍不會很大,因為會話資料是儲存在伺服器環境中的,而不是在資料庫或檔案系統中。因此,會話資料自然不會公開暴露。

使用SSL是一種特別有效的手段,它可以使資料在伺服器和客戶端之間傳送時暴露的可能性降到最低。這對於傳送敏感資料的應用來說非常重要。SSL在HTTP之上提供了一個保護層,以使所有在HTTP請求和應答中的資料都得到了保護。

如果你關心的是會話資料儲存區本身的安全,你可以對會話資料進行加密,這樣沒有正確的金鑰就無法讀取它的內容。這在PHP中非常容易做到,你只要使用session_set_save_handler( )並寫上你自己的session加密儲存和解密讀取的處理函式即可。


session 劫持

最常見的針對會話的攻擊手段是會話劫持。它是所有攻擊者可以用來訪問其它人的會話的手段的總稱。所有這些手段的第一步都是取得一個合法的會話標識來偽裝成合法使用者,因此保證會話標識不被洩露非常重要。前面關於會話暴露和固定的知識能幫助你保證會話標識只有伺服器及合法使用者才能知道。

深度防範原則可以用在會話上,當會話標識不幸被攻擊者知道的情況下,一些不起眼的安全措施也會提供一些保護。作為一個關心安全的開發者,你的目標應該是使前述的偽裝過程變得更復雜。記住無論多小的障礙,都會以你的應用提供保護。

把偽裝過程變得更復雜的關鍵是加強驗證。會話標識是驗證的首要方法,同時你可以用其它資料來補充它。你可以用的所有資料只是在每個HTTP請求中的資料:


  1. GET / HTTP/1.1  
  2. Host: example.org  
  3. User-Agent: Firefox/1.0  
  4. Accept: text/html, image/png, image/jpeg, image/gif, */*  
  5. Cookie: PHPSESSID=1234  


你應該意識到請求的一致性,並把不一致的行為認為是可疑行為。例如,雖然User-Agent(發出本請求的瀏覽器型別)頭部是可選的,但是隻要是發出該頭部的瀏覽器通常都不會變化它的值。如果你一個擁有1234的會話標識的使用者在登入後一直用Mozilla Firfox瀏覽器,突然轉換成了IE,這就比較可疑了。例如,此時你可以用要求輸入密碼方式來減輕風險,同時在誤報時,這也對合法使用者產生的衝擊也比較小。你可以用下面的程式碼來檢測User-Agent的一致性:


  1. <?php  
  2. session_start();  
  3. if (isset($_SESSION['HTTP_USER_AGENT']))  
  4. {  
  5.     if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))  
  6.     {  
  7.         /* Prompt for password */
  8.         exit;  
  9.     }  
  10. }  
  11. else
  12. {  
  13.     $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);  
  14. }  
  15. ?>  


我觀察過,在某些版本的IE瀏覽器中,使用者正常訪問一個網頁和重新整理一個網頁時發出的Accept頭部資訊不同,因此Accept頭部不能用來判斷一致性。

確保User-Agent頭部資訊一致的確是有效的,但如果會話標識通過cookie傳遞(推薦方式),有道理認為,如果攻擊者能取得會話標識,他同時也能取得其它HTTP頭部。由於cookie暴露與瀏覽器漏洞或跨站指令碼漏洞相關,受害者需要訪問攻擊者的網站並暴露所有頭部資訊。所有攻擊者要做的只是重建頭部以防止任何對頭部資訊一致性的檢查。

比較好的方法是產生在URL中傳遞一個標記,可以認為這是第二種驗證的形式(雖然更弱)。使用這個方法需要進行一些程式設計工作,PHP中沒有相應的功能。例如,假設標記儲存在$token中,你需要把它包含在所有你的應用的內部連結中:

  1. <?php  
  2. $url = array();  
  3. $html = array();  
  4. $url['token'] = rawurlencode($token);  
  5. $html['token'] = htmlentities($url['token'], ENT_QUOTES, 'UTF-8');  
  6. ?>  
  7. <a href="index.php?token=<?php echo $html['token']; ?>">Click Here</a>  


為了更方便地管理這個傳遞過程,你可能會把整個請求串放在一個變數中。你可以把這個變數附加到所有連結後面,這樣即便你一開始沒有使用該技巧,今後還是可以很方便地對你的程式碼作出變化。

該標記需要包含不可預測的內容,即便是在攻擊者知道了受害者瀏覽器發出的HTTP頭部的全部資訊也不行。一種方法是生成一個隨機串作為標記:

  1. <?php  
  2. $string = $_SERVER['HTTP_USER_AGENT'];  
  3. $string .= 'SHIFLETT';  
  4. $token = md5($string);  
  5. $_SESSION['token'] = $token;  
  6. ?>  


當你使用隨機串時(如SHIFLETT),對它進行預測是不現實的。此時,捕獲標記將比預測標記更為方便,通過在URL中傳遞標記和在cookie中傳遞會話標識,攻擊時需要同時抓取它們二者。這樣除非攻擊者能夠察看受害者發往你的應用所有的HTTP請求原始資訊才可以,因為在這種情況下所有內容都暴露了。這種攻擊方式實現起來非常困難(所以很罕見),要防止它需要使用SSL。

有專家警告不要依賴於檢查User-Agent的一致性。這是因為伺服器群集中的HTTP代理伺服器會對User-Agent進行編輯,而本群集中的多個代理伺服器在編輯該值時可能會不一致。如果你不希望依賴於檢查User-Agent的一致性。你可以生成一個隨機的標記:

  1. <?php  
  2. $token = md5(uniqid(rand(), TRUE));  
  3. $_SESSION['token'] = $token;  
  4. ?>  


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

相關推薦

PHP安全程式設計session劫持防禦session 資料暴露

GET / HTTP/1.1 Host: example.org User-Agent: Firefox/1.0 Accept: text/html, image/png, image/jpeg, image/gif, */* Cookie: PHPSESSID=1234你應該意識到請求的一致性,並把不一致的

PHP安全程式設計session劫持防禦

session 資料暴露 會話資料常會包含一些個人資訊和其它敏感資料。基於這個原因,會話資料的暴露是被普遍關心的問題。一般來說,暴露的範圍不會很大,因為會話資料是儲存在伺服器環境中的,而不是在資料庫或檔案系統中。因此,會話資料自然不會公開暴露。使用SSL是一種特別有效的手段

PHP安全程式設計防止SQL注入

SQL 注入是PHP應用中最常見的漏洞之一。事實上令人驚奇的是,開發者要同時犯兩個錯誤才會引發一個SQL注入漏洞,一個是沒有對輸入的資料進行過濾(過濾輸入),還有一個是沒有對傳送到資料庫的資料進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程式錯誤

PHP安全程式設計不要暴露資料庫訪問許可權

資料庫使用中需要關注的主要問題之一是訪問許可權即使用者名稱及密碼的暴露。在程式設計中為了方便,一般都會用一個db.inc檔案儲存,如: <?php   $db_user = 'myuser';   $db_pass = 'mypass';   $db_host =

PHP安全程式設計系列》系列分享專欄

PHP安全程式設計系列收藏夾收藏了有關PHP安全程式設計方面的知識,對PHP安全程式設計提供學習參考 《PHP安全程式設計系列》已整理成PDF文件,點選可直接下載至本地查閱 https://www.webfalse.com/read/201738.html 文章 discu

PHP安全程式設計

背景:起初,自己買了域名,伺服器,搭建了一個簡易的blog系統,發發文章,記錄一下心情什麼的,以為這個小小的網站不會有人來搞事,關於安全方面幾乎沒做工作,犯了大忌,特去總結大神路數,以作應對之策。; 相關文章出處:https://www.codeproject.com/Articles/

Linux安全程式設計避免競爭條件

【賽迪網-IT技術報道】瞭解什麼是競爭條件,以及它們為什麼會引發安全問題。本文向您展示瞭如何在類 UNIX® (Unix-like)系統中處理常見的競爭條件,包括如何正確地建立鎖檔案、鎖檔案的替代者,如何處理檔案系統,以及如何處理共享目錄(特別是如何在 /tmp 目錄下正

Asp.net安全架構之2Session hijacking(會話劫持

http://www.cnblogs.com/luminji/archive/2012/05/30/2511357.html 原理 會話劫持是指通過非常規手段,來得到合法使用者在客戶端和伺服器段進行互動的特徵值(一般為sessionid),然後偽造請求,去訪問授權使用

安全性測試入門 (四)Session Hijacking 使用者會話劫持的攻擊和防禦

本篇繼續對於安全性測試話題,結合DVWA進行研習。 Session Hijacking使用者會話劫持 1. Session和Cookies 這篇嚴格來說是使用者會話劫持諸多情況中的一種,通過會話標識規則來破解使用者session。 而且與前幾篇不同,我們有必要先來理解一下Session和Cookie的工作

高併發程式設計執行緒安全和ThreadLocal

執行緒安全的概念:當多個執行緒訪問某一個類(物件或方法)時,這個類始終都能表現出正確的行為,那麼這個類(物件或方法)就是執行緒安全的。 執行緒安全 說的可能比較抽象,下面就以一個簡單的例子來看看什麼是執行緒安全問題。 public class MyThread impleme

PHP面向物件程式設計面向物件概念、基本實踐、高階實戰、PHP面向物件特殊實踐

一、面向物件的概念 1.1 什麼是面向物件(object oriented)      世間萬物皆物件,抽象的也是物件,一切可見或不可見都是物件 1.2 物件的基本組成     

Web安全系列(四)XSS 的防禦

簡介 XSS 的防禦很複雜,並不是一套防禦機制就能就解決的問題,它需要具體業務具體實現。 目前來說,流行的瀏覽器內都內建了一些 XSS 過濾器,但是這隻能防禦一部分常見的 XSS,而對於網站來說,也應該一直尋求優秀的解決方案,保護網站及使用者的安全,我將闡述一下網站在設計上該如何避免 XSS 的攻擊。 H

Java併發程式設計執行緒安全和ThreadLocal

執行緒安全的概念:當多個執行緒訪問某一個類(物件或方法)時,這個類始終都能表現出正確的行為,那麼這個類(物件或方法)就是執行緒安全的。 執行緒安全 說的可能比較抽象,下面就以一個簡單的例子來看看什麼是執行緒安全問題。 public class MyThread

Java併發程式設計什麼是執行緒安全,以及併發必須知道的幾個概念

廢話 眾所周知,在Java的知識體系中,併發程式設計是非常重要的一環,也是面試的必問題,一個好的Java程式設計師是必須對併發程式設計這塊有所瞭解的。為了追求成為一個好的Java程式設計師,我決定從今天開始死磕Java的併發程式設計,儘量彌補自己在這方面的知識缺陷。 併發必須知道的概念

極棒 CAAD 登陸 DEF CON騰訊安全雲鼎實驗室上演防禦病毒的高階操作

人工智慧的飛速發展正在將世界帶入一個全新的維度,但這同時也將網路世界的正邪對抗推入下一個戰場。 美國當地時間8月10日,由  GeekPwn 主辦的 CAAD Village 登陸世界頂級極客大會 DEF CON 。騰訊安全雲鼎實驗室在 CAAD Village 上

php安全(二)xss攻擊

XSS 全稱為 Cross Site Scripting,跨站指令碼攻擊。它指的是惡意攻擊者往Web頁面裡插入惡意html程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html程式碼會被執行,進而達到某些人的攻擊目的。分類1、XSS反射型攻擊,惡意程式碼並沒有儲存在目標網站

PHP 鳥哥我也曾經是“不適合”程式設計的人

網名:雪候鳥,大家尊稱鳥哥,惠新宸 @Laruence, 是國內最有影響力的 PHP 技術專家,PHP 開發組核心成員,PECL 開發者,Zend 公司外聘顧問。他曾供職於雅虎,百度,現在新浪微博任平臺及資料部總架構師兼首席 PHP 顧問。惠新宸是 PHP NG 核心開發

PHP安全防範與程式設計

 簡介   當開發一個網際網路服務的時候,必須時刻牢記安全觀念,並在開發的程式碼中體現。PHP指令碼語言對安全問題並不關心,特別是對大多數沒有經驗的開發者來說。每當你講任何涉及到錢財事務等交易問題時,需要特別注意安全問題的考慮,例如開發一個論壇或者是一個購物車

Python程式設計Django之安全驗證

涉及內容 裝飾器 cookie session form驗證 快取 中介軟體 訊號 csrf 分頁 一、裝飾器 鑑權裝飾器函式 def auth(func): # 使用者驗證的裝飾器 def inner(re

Android安全加密Https程式設計

Android安全加密專題文章索引 概述 SSL(Secure Sockets Layer 安全套接層),為網景公司(Netscape)所研發,用以保障在Internet 上資料傳輸之安全,利用資料加密(Encryption)技術,可確保資料在網路上