ไม่มีวิธีใดที่จะป้องกันการลักลอบเซสชันได้ 100% แต่ด้วยวิธีการบางอย่างเราสามารถลดเวลาที่ผู้โจมตีจะขโมยเซสชันได้
วิธีป้องกันการขโมยเซสชัน:
1 - ใช้เซสชันกับใบรับรอง ssl เสมอ
2 - ส่งคุกกี้เซสชันโดยตั้งค่า httponly เป็น true เท่านั้น (ป้องกันไม่ให้ javascript เข้าถึงคุกกี้เซสชัน)
2 - ใช้รหัสสร้างเซสชันใหม่เมื่อเข้าสู่ระบบและออกจากระบบ (หมายเหตุ: อย่าใช้เซสชันสร้างใหม่ในแต่ละคำขอเพราะหากคุณมีคำขอ ajax ติดต่อกันคุณจะมีโอกาสสร้างหลายเซสชันได้)
3 - ตั้งค่าระยะหมดเวลาของเซสชัน
4 - จัดเก็บตัวแทนผู้ใช้เบราว์เซอร์ในตัวแปร $ _SESSION เปรียบเทียบกับ $ _SERVER ['HTTP_USER_AGENT'] ในแต่ละคำขอ
5 - ตั้งค่าคุกกี้โทเค็นและตั้งเวลาหมดอายุของคุกกี้นั้นเป็น 0 (จนกว่าเบราว์เซอร์จะปิด) สร้างค่าคุกกี้สำหรับแต่ละคำขอ (สำหรับคำขอ ajax อย่าสร้างโทเค็นคุกกี้ใหม่) EX:
//set a token cookie if one not exist
if(!isset($_COOKIE['user_token'])){
//generate a random string for cookie value
$cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));
//set a session variable with that random string
$_SESSION['user_token'] = $cookie_token;
//set cookie with rand value
setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
}
//set a sesison variable with request of www.example.com
if(!isset($_SESSION['request'])){
$_SESSION['request'] = -1;
}
//increment $_SESSION['request'] with 1 for each request at www.example.com
$_SESSION['request']++;
//verify if $_SESSION['user_token'] it's equal with $_COOKIE['user_token'] only for $_SESSION['request'] > 0
if($_SESSION['request'] > 0){
// if it's equal then regenerete value of token cookie if not then destroy_session
if($_SESSION['user_token'] === $_COOKIE['user_token']){
$cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));
$_SESSION['user_token'] = $cookie_token;
setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
}else{
//code for session_destroy
}
}
//prevent session hijaking with browser user agent
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']){
die('session hijaking - user agent');
}
หมายเหตุ: อย่าสร้างคุกกี้โทเค็นใหม่ด้วยหมายเหตุการร้องขอ ajax: โค้ดด้านบนเป็นตัวอย่าง หมายเหตุ: หากผู้ใช้ออกจากระบบโทเค็นคุกกี้จะต้องถูกทำลายเช่นเดียวกับเซสชัน
6 - ไม่ใช่เรื่องดีที่จะใช้ ip ของผู้ใช้เพื่อป้องกันการขโมยเซสชันเนื่องจากผู้ใช้บางราย ip เปลี่ยนไปตามคำขอแต่ละครั้ง ที่มีผลต่อผู้ใช้ที่ถูกต้อง
7 - โดยส่วนตัวแล้วฉันเก็บข้อมูลเซสชันไว้ในฐานข้อมูลขึ้นอยู่กับคุณว่าคุณใช้วิธีใด
หากคุณพบข้อผิดพลาดในแนวทางของฉันโปรดแก้ไขฉัน หากคุณมีวิธีอื่น ๆ ในการป้องกันการแอบดูเซสชันโปรดบอกฉัน