Non esiste alcun modo per impedire il dirottamento della sessione al 100%, ma con un certo approccio possiamo ridurre il tempo impiegato da un utente malintenzionato a dirottare la sessione.
Metodo per prevenire il dirottamento della sessione:
1 - usa sempre la sessione con certificato ssl;
2 - invia cookie di sessione solo con httponly impostato su true (impedisce a javascript di accedere ai cookie di sessione)
2 - usa ID rigenerazione sessione all'accesso e alla disconnessione (nota: non utilizzare rigenerazione sessione ad ogni richiesta perché se hai una richiesta Ajax consecutiva hai la possibilità di creare più sessioni.)
3 - imposta un timeout di sessione
4 - memorizza l'agente utente del browser in una variabile $ _SESSION e confronta con $ _SERVER ['HTTP_USER_AGENT'] ad ogni richiesta
5 - imposta un cookie token e imposta il tempo di scadenza di quel cookie su 0 (fino alla chiusura del browser). Rigenera il valore del cookie per ogni richiesta (per la richiesta Ajax non rigenerare il 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');
}
nota: non rigenerare il cookie token con la richiesta ajax nota: il codice sopra è un esempio. nota: se gli utenti si disconnettono, il token cookie deve essere distrutto e la sessione
6 - non è un buon approccio usare l'ip utente per prevenire il dirottamento della sessione perché l'ip di alcuni utenti cambia con ogni richiesta. CHE INTERESSANO GLI UTENTI VALIDI
7 - personalmente memorizzo i dati della sessione nel database, dipende da te quale metodo adotti
Se trovi errori nel mio approccio, per favore correggimi. Se hai altri modi per prevenire l'hyjaking della sessione, per favore dimmelo.