服務端和客戶端之間是通過session(會話)來連接溝通。當客戶端的浏覽器連接到服務器後,服務器就會建立一個該用戶的session。每個用戶的session都是獨立的,並且由服務器來維護。每個用戶的session是由一個獨特的字符串來識別,成為session id。用戶發出請求時,所發送的http表頭內包含session id 的值。服務器使用http表頭內的session id來識別時哪個用戶提交的請求。
session保存的是每個用戶的個人數據,一般的web應用程序會使用session來保存通過驗證的用戶賬號和密碼。在轉換不同的網頁時,如果需要驗證用戶身份,就是用session內所保存的賬號和密碼來比較。session的生命周期從用戶連上服務器後開始,在用戶關掉浏覽器或是注銷時用戶session_destroy函數刪除session數據時結束。如果用戶在20分鐘內沒有使用計算機的動作,session也會自動結束。
php處理session的應用架構
會話劫持
會話劫持是指攻擊者利用各種手段來獲取目標用戶的session id。一旦獲取到session id,那麼攻擊者可以利用目標用戶的身份來登錄網站,獲取目標用戶的操作權限。
攻擊者獲取目標用戶session id的方法:
1)暴力破解:嘗試各種session id,直到破解為止。
2)計算:如果session id使用非隨機的方式產生,那麼就有可能計算出來
3)竊取:使用網絡截獲,xss攻擊等方法獲得
會話劫持的攻擊步驟
實例
//login.php
<?php
session_start();
if (isset($_POST["login"]))
{
$link = mysql_connect(“localhost”, “root”, “root”)
or die(“無法建立MySQL數據庫連接:” . mysql_error());
mysql_select_db(“cms”) or die(“無法選擇MySQL數據庫”);
if (!get_magic_quotes_gpc())
{
$query = “select * from member where username=’” . addslashes($_POST["username"]) .
“’ and password=’” . addslashes($_POST["password"]) . “’”;
}
else
{
$query = “select * from member where username=’” . $_POST["username"] .
“’ and password=’” . $_POST["password"] . “’”;
}
$result = mysql_query($query)
or die(“執行MySQL查詢語句失敗:” . mysql_error());
$match_count = mysql_num_rows($result);
if ($match_count)
{
$_SESSION["username"] = $_POST["username"];
$_SESSION["password"] = $_POST["password"];
$_SESSION["book"] = 1;
mysql_free_result($result);
mysql_close($link);
header(“Location: http://localhost/index.php?user=” .
$_POST["username"]);
}
…..