No hay forma de evitar el secuestro de la sesión al 100%, pero con algún enfoque podemos reducir el tiempo para que un atacante se apodere de la sesión.
Método para evitar el secuestro de sesión:
1 - use siempre la sesión con certificado SSL;
2: envíe la cookie de sesión solo con httponly establecido en true (evite que javascript acceda a la cookie de sesión)
2: use el ID de regeneración de sesión al iniciar y cerrar sesión (nota: no use la regeneración de sesión en cada solicitud porque si tiene una solicitud ajax consecutiva, entonces tiene la oportunidad de crear múltiples sesiones).
3 - establecer un tiempo de espera de sesión
4: almacene el agente de usuario del navegador en una variable $ _SESSION y compárelo con $ _SERVER ['HTTP_USER_AGENT'] en cada solicitud
5: establezca una cookie de token y establezca el tiempo de caducidad de esa cookie en 0 (hasta que se cierre el navegador). Vuelva a generar el valor de la cookie para cada solicitud. (Para la solicitud ajax, no regenere la cookie de 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: no regenere la cookie de token con la solicitud de ajax nota: el código anterior es un ejemplo. nota: si los usuarios cierran sesión, el token de cookie debe destruirse, así como la sesión
6 - no es un buen enfoque utilizar la ip del usuario para evitar el secuestro de sesión porque la ip de algunos usuarios cambia con cada solicitud. QUE AFECTAN A USUARIOS VÁLIDOS
7 - personalmente almaceno los datos de la sesión en la base de datos, depende de usted qué método adopte
Si encuentra un error en mi enfoque, corríjame. Si tiene más formas de evitar la sesión de hyjaking, dígame.