Le protocole HTTP est "stateless" ce qui veut dire que si on veut retenir certaines informations sur l'utilisateur alors qu'il navigue entre plusieurs pages, on doit créer une session. Celle-ci peut être la cible d'attaques pour pouvoir usurper l'identité du visiteur connecté et se faire passer pour lui en lui "volant" sa session.
Dans un site programmé en PHP, tous les utilisateurs sont vulnérables s'il utilise seulement session_start(). Si le hacker est capable de récupérer l'ID de votre session active, il pourra l'utiliser en l'initialisant par la querystring (page.php?PHPSESSID=identifiant).
Pour contrer cette vulnérabilité, on peut utiliser la fonction built-in de PHP session_regenerate_id() qui génère un nouvel identifiant de session lors de la vérification de l'initialisation.
session_start();Si, comme moi, vous montez vos projets avec Zend Framework, vous préférerez certainement le composant Zend_Session :
if( !isset($_SESSION['initialized']) ) {
session_regenerate_id();
$_SESSION['initialized'] = true;
}
$defaultNamespace = new Zend_Session_Namespace();À la fin, assurez-vous aussi de détruire la session, que ce soit par un mécanisme de déconnexion ou par une expiration forcée par le serveur (voir php.ini ou ini_set).
if( !isset($defaultNamespace->initialized) ) {
Zend_Session::regenerateId();
$defaultNamespace->initialized = true;
}
# PHP
session_destroy();
# ZF
Zend_Session::destroy();