php是一種廣泛使用的服務器端腳本語言,在web開發上有著不可替代的地位。不過,隨著網絡環境的不斷變化,php會話劫持已成為一個嚴重的安全問題。
所謂會話劫持,就是黑客通過各種手法獲取合法用戶的會話信息,從而控制用戶的賬號。這種攻擊方式的危害性極大,因為黑客可以在不知情的情況下隱藏在用戶身份控制之下,進行各種非法活動。
下面,我們來看幾個會話劫持的案例:
//黑客通過在瀏覽器中執行以下js代碼,盜取了用戶的會話id document.cookie="PHPSESSID="+'盜取的session id'; //黑客通過嗅探用戶在wifi上的流量中獲取的會話id,從而成功控制了用戶賬號
為了防止會話劫持,我們需要在php代碼中加入足夠的安全機制。下面列舉幾個重要的實現方法:
1. 將session id存儲在數據庫中,并通過cookie將其發送給瀏覽器。這種方式雖然相對安全,但是會大大增加開銷和管理復雜度。
//通過pdo方式將session id存儲到mysql中 //初始化pdo連接 try{ $pdo=new PDO('mysql:host=localhost;dbname=test','root',''); }catch(PDOException $e){ echo $e->getMessage(); } //啟動session,將session id以cookie的形式發送到瀏覽器 session_start(); setcookie('PHPSESSID',session_id(),time()+3600); //將session id存入mysql數據庫 $stmt=$pdo->prepare('insert into sessions(sid,data) values(:sid,:data)'); $stmt->execute(array( ':sid'=>session_id(), ':data'=>serialize($_SESSION) ));
2. 將session id存儲在memcached中,并通過cookie將其發送給瀏覽器。這種方式比前一種方式更為高效、簡單,是目前流行的解決方案。
//通過php-memcached擴展將session id存儲到memcached中 //初始化memcached連接 $mc=new Memcached(); $mc->addServer('localhost',11211); //啟動session,將session id以cookie的形式發送到瀏覽器 session_start(); setcookie('PHPSESSID',session_id(),time()+3600); //將session id存入memcached $mc->set(session_id(),serialize($_SESSION),3600);
3. 對session id進行加密處理,增加黑客攻擊的難度。
//對session id進行加密處理,并以cookie的形式發送到瀏覽器 session_start(); $key='e34345t45y5tretryh7d'; function encrypt($data,$key){ $s=mcrypt_module_open(MCRYPT_CAST_256,'','cbc',''); $iv=mcrypt_create_iv(32,MCRYPT_DEV_RANDOM); mcrypt_generic_init($s,$key,$iv); $encrypted=base64_encode(mcrypt_generic($s,$data)); mcrypt_generic_deinit($s); return $encrypted; } setcookie('PHPSESSID',encrypt(session_id(),$key),time()+3600); //在獲取session id時進行解密處理 function decrypt($data,$key){ $s=mcrypt_module_open(MCRYPT_CAST_256,'','cbc',''); $iv=mcrypt_create_iv(32,MCRYPT_DEV_RANDOM); mcrypt_generic_init($s,$key,$iv); $decrypted=mdecrypt_generic($s,base64_decode($data)); mcrypt_generic_deinit($s); return $decrypted; } $sid=decrypt($_COOKIE['PHPSESSID'],$key); session_id($sid);
4. 每次請求都對session id進行驗證,以防止黑客盜取信息。
//對session id進行驗證 session_start(); if($_COOKIE['PHPSESSID']!=session_id()){ die('session劫持!'); } //在主頁中輸出用戶信息 echo $_SESSION['username'];
在實際應用中,以上安全機制應該根據實際情況進行選擇和組合,從而保證php應用的安全性。
下一篇css文字靠前又靠后