[RESOLU] Session détruite accessible par le bouton "Reculer" du navigateur

Zax
Eléphanteau du PHP | 22 Messages

22 déc. 2017, 13:55

Bonjour,

Supposons un site web (hébergement mutualisé) avec une partie nécessitant d'être loggé (l'équivalent d'un espace "Mon compte"). Comme cet "espace" comporte plusieurs pages, je stocke un flag "loggé" en $_SESSION, pour ne pas que l'utilisateur ait à se relogger sur chaque page de son espace.
Maintenant, c'est l'action Se Déconnecter qui pose problème : un clic sur ce bouton renvoit bien à la page d'authentication, et l'accès à l'espace perso renvoit également à la page d'authentication, ce qui est normal. On a l'impression d'être bien déconnecté, mais il suffit d'utiliser le bouton Reculer (back) du navigateur pour que celui propose de renvoyer le formulaire. Si on accepte, paf, on se retrouve sur son espace perso sans avoir besoin de rentrer ses login/pass :(

Testé sur Firefox 48.x. Je sais, c'est un vieux truc, mais quand je vais par exemple sur le site de la FNAC, que je me connecte à mon compte et qu'ensuite je me déconnecte, le coup du "back-navigateur" ne fonctionne pas. Je pense donc que mon souci est indépendant du navigateur et de sa configuration.

J'utilise les scripts suivants :

Code : Tout sélectionner

ini_set('session.use_strict_mode', '1');
Destruction de session :

Code : Tout sélectionner

$_SESSION = array(); if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } session_destroy();
Bien que mon site ne contiennent pas de secrets d'état, je trouve quand même qu'un simple "back-navigateur" est un peu facile pour contourner mon processus de déconnection.

Merci de votre aide.
Modifié en dernier par Zax le 22 déc. 2017, 14:12, modifié 1 fois.

Mammouth du PHP | 1967 Messages

22 déc. 2017, 14:10

pourquoi ne pas utiliser session_desytroy()
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Zax
Eléphanteau du PHP | 22 Messages

22 déc. 2017, 14:13

Oups, édition de mon post : j'utilise bien "session_destroy()" à la fin du script.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 déc. 2017, 19:55

Bonjour,

Tu rencontres en fait plusieurs problèmes :
- le cache du navigateur : celui-ci est fait de tel sorte qu'en faisant "précédent", le navigateur va afficher l'url demandée tel que l'utilisateur l'a consulté. Ainsi, je si je me connecte à un site, je consulte une url protégée, je me déconnecte et je laisse ma place à quelqu'un d'autre sans fermer le navigateur, alors le fait de cliquer sur précédent lui permet de consulter l'url protégée puisque je l'ai moi même affichée. Pas vraiment de solution à cela bien qu'avec ajax tu puisses jouer sur le contenu de la page sans en changer l'adresse et ça, les navigateurs maîtrisent pas bien.

- le renvoi du formulaire : quand tu soumets un formulaire en post pour afficher une page et que tu demandes à réafficher cette même page depuis le cache du navigateur, ce dernier te demandes si tu veux reposter les données qui ont servi à afficher la page. S'il s'agit de ton login/mdp, alors le navigateur les renvois et tu te retrouves à nouveau connecté. Pour éviter cela, on recommande à ce que la page qui traite les données du formulaire redirige l'utilisateur vers une URL accessible en get. On parle de pattern PRG pour Post Redirect Get et il y a de mémoire un article sur le comment ça marche dans la FAQ du forum. Du coup, puisque l'url finale ouverte n'a pas été accédée directement par l'envoi du formulaire, le navigateur ne propose/permet pas de re-poster les données.

En espérant te permettre d'y voir plus clair :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Zax
Eléphanteau du PHP | 22 Messages

23 déc. 2017, 11:33

- le renvoi du formulaire : quand tu soumets un formulaire en post pour afficher une page et que tu demandes à réafficher cette même page depuis le cache du navigateur, ce dernier te demandes si tu veux reposter les données qui ont servi à afficher la page. S'il s'agit de ton login/mdp, alors le navigateur les renvois et tu te retrouves à nouveau connecté.
C'est exactement ça.
Pour éviter cela, on recommande à ce que la page qui traite les données du formulaire redirige l'utilisateur vers une URL accessible en get. On parle de pattern PRG pour Post Redirect Get et il y a de mémoire un article sur le comment ça marche dans la FAQ du forum. Du coup, puisque l'url finale ouverte n'a pas été accédée directement par l'envoi du formulaire, le navigateur ne propose/permet pas de re-poster les données.
J'ai regardé la section FAQ sans succès, et j'avoue ne pas avoir bien compris l'idée du GET. Je vais chercher sur le net.
Merci pour cette réponse qui m'apporte une piste intéressante :)

Zax
Eléphanteau du PHP | 22 Messages

23 déc. 2017, 12:43

OK, j'ai trouvé des exemples qui fonctionnent parfaitement.
Encore merci :)