Bonsoir
J'ai un gros soucis !
Je suis en train de me torturer les neurones avec un projet de site qui devra gérer un espace membre.
Je vous passe les détails et je vais essayer d'être concis.
Quand un utilisateur tente de se connecter et que le couple user/pass est vérifié, une fonction assigne à $_SESSION['idUser'] l'id de l'utilisateur. Comme ça il me suffit de vérifier que $_SESSION['idUser'] existe pour savoir si un utilisateur est connecté et a passé le "barrage".
Mais pour plus de sécurité j'ai envi de m'appuyer sur une base de données. J'ai créé une table "Sessions" (je vous montre la requête de création (((générée par phpMyAdmin))) ça ira plus vite que de longues explications...) :
Ainsi, ma fonction n'assigne pas seulement une valeur à $_SESSION['idUser'] mais remplit aussi la table Sessions avec l'id de la session en cours, l'id de l'utilisateur et une date d'expiration.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE `test`.`Sessions` ( `id` VARCHAR( 26 ) NOT NULL , `id_user` SMALLINT( 3 ) UNSIGNED NOT NULL , `expire` TIMESTAMP NOT NULL ) ENGINE = MYISAM ;
Le but du jeu est que mon application vérifie que la variable de session existe ET que celle-ci corresponde à une entrée dans la table Session ET que la session soit encore valide.
Voici un peu de code :
Ouf, si vous avez eu le courage de lire mes pavés, on en vient au problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 // Fonction qui "crée" la session une fois que l'utilisateur a correctement saisi son login et pass function creerSession($idUser, $pseudo) { $_SESSION['idUser'] = $idUser; $_SESSION['pseudo'] = $pseudo; session_regenerate_id(); $idSession = session_id(); // BDD_HOST etc. sont des constantes correctement définies $pdo = new PDO("mysql:host=" . BDD_HOST . ";dbname=" . BDD_BASE, BDD_USER, BDD_PASS); $idSql = $pdo->quote($idSession); $idUserSql = $pdo->quote($idUser); // Il semble y avoir un problème ici. Avec CURRENT_TIMESTAMP + 1800 ??? C'est le +1800 ??? $req = "INSERT INTO MPR_Sessions (id, id_user, expire) VALUES ($idSql, $idUserSql, CURRENT_TIMESTAMP + 1800)"; $pdo->exec($req); }
Pendant quelques instants, les tests de session dans mon application marchaient à merveille ! Puis à force de tests, je me suis rendu compte que ça ne marchait plus. Puis de nouveau opérationnel...
Après m'être arraché beaucoup de cheveux, j'ai découvert quelque chose de louche !
En surveillant la table Session, j'ai remarqué que certaines lignes étaient correctes (le champ ‘expire‘ contient le timestamp du login + 30 minutes) mais d'autres non Là le champ ‘expire‘ vaut tout simplement 0 ! (phpMyAdmin m'affiche 0000-00-00 00:00:00).
Si j'étais toujours un seul cas je comprendrais, mais là...
pour info je suis en local, avec un serveur apache 2.2.14 (intégré à MacOSX), PHP 5.3.1 et MySql 5.0.5.
Est-ce mes serveurs locaux qui partent en live ou est-ce mon code qui n'est pas top ?
Vous m'avez lu jusqu'ici, je vous remercie beaucoup
Et encore plus si vous avez des réponses ou remarques
Partager