Il n'y a aucun moyen d'empêcher le piratage de session à 100%, mais avec une certaine approche, nous pouvons réduire le temps pour un attaquant de détourner la session.
Méthode pour éviter le détournement de session:
1 - utilisez toujours la session avec un certificat SSL;
2 - envoyer le cookie de session uniquement avec httponly défini sur true (empêcher javascript d'accéder au cookie de session)
2 - utilisez l'identifiant de régénération de session à la connexion et à la déconnexion (note: n'utilisez pas la régénération de session à chaque demande car si vous avez une requête ajax consécutive, vous avez la possibilité de créer plusieurs sessions.)
3 - Définissez un délai d'expiration de session
4 - stocker l'agent utilisateur du navigateur dans une variable $ _SESSION et comparer avec $ _SERVER ['HTTP_USER_AGENT'] à chaque requête
5 - définissez un cookie de jeton et définissez l'heure d'expiration de ce cookie sur 0 (jusqu'à ce que le navigateur soit fermé). Régénérez la valeur du cookie pour chaque requête (pour une requête ajax, ne régénérez pas le cookie de jeton). 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');
}
note: ne pas régénérer le cookie de jeton avec la requête ajax note: le code ci-dessus est un exemple. Remarque: si les utilisateurs se déconnectent, le jeton de cookie doit être détruit ainsi que la session
6 - Ce n'est pas une bonne approche d'utiliser l'IP de l'utilisateur pour empêcher le piratage de session car certains utilisateurs changent d'IP à chaque demande. QUI AFFECTENT LES UTILISATEURS VALIDES
7 - Personnellement, je stocke les données de session dans la base de données, c'est à vous de décider quelle méthode vous adoptez
Si vous trouvez une erreur dans mon approche, veuillez me corriger. Si vous avez d'autres moyens d'empêcher l'hyjaking de session, veuillez me le dire.