Maison >développement back-end >tutoriel php >Comment expirer de manière fiable une session PHP après 30 minutes d'inactivité ?

Comment expirer de manière fiable une session PHP après 30 minutes d'inactivité ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 22:56:15374parcourir

How to Reliably Expire a PHP Session After 30 Minutes of Inactivity?

Comment expirer efficacement une session PHP après 30 minutes

Bien que PHP fournisse des options telles que session.gc_maxlifetime et session.cookie_lifetime pour l'expiration de la session, ils ne sont pas entièrement fiables. Voici une approche complète pour implémenter votre propre mécanisme d'expiration de session.

Problèmes avec les options intégrées de PHP :

  • session.gc_maxlifetime : Il spécifie quand les données de session sont considérées comme des « poubelles » et nettoyées au démarrage de la session. Cependant, le garbage collector s'exécute sporadiquement, avec une probabilité par défaut de seulement 1 %, ce qui peut entraîner une interruption prématurée de la session.
  • session.cookie_lifetime : Cette option détermine la durée de vie du cookie de session envoyé. au navigateur. Cependant, cela n'invalide pas la session elle-même, qui reste sous la responsabilité du serveur.

Mise en place d'un délai d'expiration de session personnalisé :

Le moyen le plus efficace d'expirer une session après une période d'inactivité spécifique consiste à implémenter votre propre mécanisme de délai d'attente. Cela implique de conserver un horodatage de la dernière activité (demande) et de le mettre à jour à chaque demande. Si la dernière activité remonte à plus de 30 minutes, vous pouvez annuler et détruire la session.

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset(); // unset $_SESSION variable for the run-time
    session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

En mettant continuellement à jour les données de la session, vous évitez que la date de modification du fichier de session ne soit supprimée prématurément par le garbage collector.

Mesures de sécurité supplémentaires :

Pour éviter les attaques telles que la fixation de session, vous pouvez régénérer périodiquement l'ID de session en mettant à jour l'horodatage $_SESSION['CREATED'] :

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time(); // update creation time
}

Remarques :

  • Assurez-vous que session.gc_maxlifetime est défini sur une valeur au moins égale à la durée de vie de votre gestionnaire d'expiration personnalisé (1 800 dans cet exemple).
  • Pour expirer la session après 30 minutes d'activité au lieu de depuis le début, utilisez setcookie avec un délai d'expiration time() 60 * 30 pour garder le cookie de session actif.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn