Tidak ada cara untuk mencegah pembajakan sesi 100%, tetapi dengan beberapa pendekatan kita dapat mengurangi waktu bagi penyerang untuk membajak sesi.
Metode untuk mencegah pembajakan sesi:
1 - selalu gunakan sesi dengan sertifikat ssl;
2 - kirim cookie sesi hanya dengan httponly disetel ke true (mencegah javascript untuk mengakses cookie sesi)
2 - gunakan sesi regenerasi id saat login dan logout (catatan: jangan gunakan sesi regenerasi pada setiap permintaan karena jika Anda memiliki permintaan ajax berturut-turut maka Anda memiliki kesempatan untuk membuat beberapa sesi.)
3 - atur batas waktu sesi
4 - simpan agen pengguna browser dalam variabel $ _SESSION dan bandingkan dengan $ _SERVER ['HTTP_USER_AGENT'] di setiap permintaan
5 - tetapkan token cookie, dan setel waktu kedaluwarsa cookie itu ke 0 (hingga browser ditutup). Buat kembali nilai cookie untuk setiap permintaan. (Untuk permintaan ajax jangan membuat ulang cookie token). 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');
}
catatan: jangan membuat ulang cookie token dengan permintaan ajax catatan: kode di atas adalah contoh. catatan: jika pengguna logout maka token cookie harus dihancurkan serta sesi
6 - Ini bukan pendekatan yang baik untuk menggunakan ip pengguna untuk mencegah pembajakan sesi karena beberapa ip pengguna berubah dengan setiap permintaan. YANG MEMPENGARUHI PENGGUNA YANG VALID
7 - secara pribadi saya menyimpan data sesi dalam database, terserah Anda metode apa yang Anda adopsi
Jika Anda menemukan kesalahan dalam pendekatan saya, mohon perbaiki saya. Jika Anda memiliki lebih banyak cara untuk mencegah sesi hyjaking tolong beri tahu saya.