web-dev-qa-db-fra.com

Durée de vie du cookie de session dans PHP différente sur RHEL vs Mint?

Désolé si c'est long:

J'ai le même site fonctionnant sur deux serveurs (server_old & server_new). C’est une chose roulée à la main PHP & Ajax pour la gestion de mon inventaire et le prêt d’équipement à des clients. Son système de connexion de base est similaire à celui présenté sur ce site: Comment créer un script de connexion sécurisée dans PHP et MYSQL . Donc, il utilise PHP variables de session pour vérifier si vous êtes connecté et vous oblige à la page de connexion sinon. Je n'ai mis en place aucun mécanisme pour vous mettre à la porte après tant de minutes ou d'heures, du moins pas intentionnellement.

Server_old exécute Linux Mint 17 avec Apache 2.4.7 & PHP 5.5.9, et server_new exécute RHEL 7 avec Apache 2.4.6 & PHP 5.4.16.

J'ai regardé dans les httdp.conf et php.ini des deux systèmes et je ne comprends pas pourquoi:

Lorsque je suis connecté au site sur server_old, mon identifiant ne semble être valide que pendant environ 20 minutes d'inactivité. Cela a du sens si gc_maxlifetime l’affecte. Lorsque j'essaie d'accéder à une page après une longue période d'inactivité, cela me redirige vers la page de connexion. C'est bon pour la sécurité bien sûr, donc rien à redire.

Ensuite, j'ai migré le site et la base de données vers server_new et je suis connecté (e) sans aucune activité pendant ce qui semble être plusieurs heures et c'est toujours bon. Je sais que ça fait plus de 2 heures et je suis à peu près sûr que cela dure plus de 3 heures. Je peux toujours me déconnecter manuellement et le site ne me laisse pas dépasser la page de connexion tant que je ne me suis pas reconnecté. Cette partie fonctionne donc.

Je n'arrive pas à comprendre pourquoi je me suis déconnecté du site après quelques minutes sur Mint et sous RHEL, mes sessions PHP semblent durer éternellement. Les deux serveurs ont:

  • session.cookie_lifetime = 0
  • session.cache_expire = 180 (180 minutes)
  • session.gc_maxlifetime = 1440 (1440 secondes/24 minutes)

phpinfo () indique la même chose sur les deux systèmes. Cependant, sur menthe, la probabilité_cbc est définie sur 0/1000 (ce qui empêche essentiellement de collecter la corbeille?), Tandis que sur RHEL, elle est définie sur 1/1000. Vous penseriez que ne jamais collecter les ordures et que cookie_lifetime = 0 signifierait que la session durerait éternellement sur Mint. Mais c'est le contraire apparemment.

Les deux serveurs Apache ont été configurés avec le même Timeout, KeepAlive, etc.

Des idées?

2
user2461087

Ce qui se passe ici est principalement dû aux différences de garbage collection entre les différentes versions de Linux. Comme mentionné ci-dessus par @Tim Fountain Garbage Collection dans des versions de linux basées sur Debian, effectue la collecte des déchets via un travail cron. Une vérification de la documentation PHP sur les sessions indique que l'heure définie dans gc_maxlifetime est le nombre de secondes après lequel les données seront considérées comme des ordures et potentiellement nettoyé. Si la récupération de place ne s'exécute pas régulièrement sur votre serveur, cela ne se déclenchera pas et les données resteront.

La méthode la plus fiable pour déconnecter un utilisateur d'une session après un certain temps d'inactivité consiste à ajouter une variable de session appelée quelque chose comme lastAction, qui doit être un horodatage unix utilisant la fonction time(). Ensuite, chaque fois qu'une demande est faite, vous vérifiez tout d'abord si l'horodatage lastAction est plus ancien qu'un certain nombre de secondes (en fonction du temps maximal d'inactivité souhaité). Si c'est le cas, supprimez la session, exécutez la Déconnectez le code et redirigez l'utilisateur vers la page de connexion, s'il est inférieur au nombre maximal de secondes, réinitialisez la valeur de la variable de session lastAction avec l'horodatage de l'unité en cours et poursuivez.

1
Chris Rutherfurd