Pourquoi ma session php n'est-elle pas enregistrée lorsque je navigue sur les pages d'un site Web ?
Je crée un site Web qui utilise une simple paire nom d'utilisateur-mot de passe pour permettre aux administrateurs de s'authentifier sur la page de connexion. Pour ce faire, une session est d'abord créée lorsque l'utilisateur arrive sur la page d'accueil, puis lorsqu'il clique sur le bouton de connexion, il est redirigé vers un formulaire pour saisir son identifiant et son mot de passe, puis le formulaire est envoyé à un autre via la méthode POST. pour vérifier le nom d'utilisateur et le mot de passe Si la page est valide, placez une variable dans la session contenant le nom d'utilisateur administrateur connecté, puis redirigez vers le tableau de bord d'administration, vérifiez que la variable est définie pour vérifier s'il s'agit bien d'un administrateur sur la page.
Comme expliqué dans le titre, le principal problème est que lorsque je teste la page d'accueil, une session est créée, mais lorsque je clique sur le lien vers le formulaire de connexion, la session semble être détruite, même si je supprime ou neutralise tout ce qui pourrait l'être. provoquant ces instructions.
Petit extrait php (main.php) sur la page d'accueil pour démarrer la session
<?php session_start(['cookie_lifetime' => 86400]); $_SESSION["start"] = time(); error_log("Test de session : ".session_status()." | ".$_SESSION["start"]."; \n", 3, "log1.txt"); //puts in the log the session status and the content of the variable assigned above. if (!is_writable(session_save_path())) { error_log('Session path '.session_save_path()." is not writable for PHP; \n", 3, "log1.txt"); } else { error_log('Session path '.session_save_path()." is writable for PHP; \n", 3, "log1.txt"); } ?>
J'ai essayé de remplacer le cycle de vie des cookies comme indiqué ci-dessus pour obtenir un extrait de la réponse à cette question afin de voir si le dossier était accessible en écriture et si la session a été créée. Le journal revient toujours à la page d'accueil :
Test de session : 2 | 1684946314; Session path C:\MAMP\bin\php\sessions\ is writable for PHP;
(La première ligne | le numéro qui la suit est l'horodatage attendu).
Le seul extrait de code php dans le formulaire de connexion (connexion.php)
<?php if (isset($_SESSION["logged_admin"])) { header("Location: auth.php"); exit(); } error_log("Test de session : ".session_status()." | ".$_SESSION["start"]."; \n", 3, "log1.txt"); if (!is_writable(session_save_path())) { error_log('Session path '.session_save_path()." is not writable for PHP; \n", 3, "log1.txt"); } else { error_log('Session path '.session_save_path()." is writable for PHP; \n", 3, "log1.txt"); } ?>
J'ai mis le premier if là pour que les administrateurs connectés soient redirigés directement vers le tableau de bord s'ils sont déjà connectés. Les lignes suivantes effectuent le même test que dans main.php, mais cette fois retournent dans le journal :
Test de session : 1 | ; Session path C:\MAMP\bin\php\sessions\ is writable for PHP;
Cela indique que la session a été détruite et que toutes ses variables ne sont pas définies.
Partie du code dans le fichier php chargé de vérifier le nom d'utilisateur et le mot de passe fournis liés à l'utilisation de la session (auth.php)
<?php error_log("\n\n------- [AUTH START ".date(DATE_RFC2822)." ] -------\n", 3, "log1.txt"); $fail = 0; /*if (isset($_SESSION["logged_admin"]) && isset($_SESSION['start']) && (time() - $_SESSION['start'] > 1800)) { session_unset(); session_destroy(); session_start(['cookie_lifetime' => 86400]); $_SESSION["start"] = time(); error_log("Session expirée (connecté + de 30 min);\n", 3, "log1.txt"); echo "Votre session a expirée. Veuillez vous reconnecter."; $fail = 1; goto fail; }*/ //code that checks if a session is loaded during too much time and if yes, destroys it. I've put the code in a comment so it normally shouldn't be executed by the server. error_log("Test de session : ".session_status()." | ".$_SESSION["start"]."; \n", 3, "log1.txt"); if (!is_writable(session_save_path())) { error_log('Session path '.session_save_path()." is not writable for PHP; \n", 3, "log1.txt"); } else { error_log('Session path '.session_save_path()." is writable for PHP; \n", 3, "log1.txt"); } //Here's once again the similar tests done in the other files. if (isset($_SESSION["logged_admin"])) { error_log("L'administrateur est déjà connecté;\n", 3, "log1.txt"); goto fail; } //Other stuff that verifies if the data sent with POST method is there and connecting the local server to the database i use. $Accounts = $AccountsQuery->fetchAll(); //Converts the data i've received via a SQL query foreach ($Accounts as $Compte) { if ($Compte["login"] == $login && $Compte["mdp"] == $mdp) { $_SESSION["logged_admin"] = $login; //if a username-password couple from the registered admins corresponds to the couple sent via the log in form, the username retrieved from the log in form ($login) is associated to the session's array. error_log(session_status()."; \n", 3, "log1.txt"); error_log("Login et mot de passe valides | ".var_dump($_SESSION["logged_admin"])." est désormais connecté sur la session ".session_id()." ;\n", 3, "log1.txt"); goto fail; } } $fail = 1; error_log("Login et mot de passe invalide; \n", 3, "log1.txt"); echo "L'identifiant ou le mot de passe fourni est invalide."; ?>
Le log renvoyé en exécutant le fichier après soumission du formulaire :
------- [AUTH START Wed, 24 May 2023 16:49:17 +0000 ] ------- Test de session : 1 | ; Session path C:\MAMP\bin\php\sessions\ is writable for PHP; PDO set up for authentification; 1; Login et mot de passe valides | est désormais connecté sur la session ; Authentification réussie le Wed, 24 May 2023 16:49:17 +0000 - British GMT hour ----------------------- [AUTH END]
Depuis que j'avais mis les identifiants d'administrateur enregistrés dans le formulaire, l'authentification elle-même a réussi, mais après avoir cliqué pour accéder au formulaire de connexion, la session créée dans la page d'accueil s'est avérée toujours supprimée, je n'ai donc pas pu mettre le nom d'utilisateur dans $_SESSION Administrateurs connectés au groupe.
si la structure empêche les utilisateurs non autorisés d'accéder au contenu du tableau de bord réservé aux administrateurs (dashboard.php)
<?php if (isset($_SESSION["logged_admin"])) { ?> //If there's a logged-in admin, shows up the dashboard with the admin-stuff to do. <?php } else { echo "Vous ne pouvez pas accéder à cette page car vous n'êtes pas connecté. Veuillez vous rediriger vers la page principale."; }; ?> //Else shows the user on the page that he isn't logged-in.
Extraits de deux fichiers de configuration de composants PHP utilisés dans mon serveur (php 8.1.0)
php.ini-development
... ; ; where MODE is the octal representation of the mode. Note that this ; does not overwrite the process's umask. ; https://php.net/session.save-path session.save_path = "tmp/"
php.ini-production
; ; where MODE is the octal representation of the mode. Note that this ; does not overwrite the process's umask. ; https://php.net/session.save-path session.save_path = "tmp/"Le paramètre
session.save_path n'est apparemment pas commenté dans les deux. Cependant, ce n'est pas le chemin renvoyé par la fonction session_save_path().
https://www.php.net/manual/en/function.session-start.php
Chaque fois qu'une nouvelle page est chargée, il s'agit d'une requête HTTP différente. Une session doit être démarrée à chaque requête HTTP, vous devez donc ajouter
session_start()
à chaque page.Je recommande de créer un fichier d'en-tête unique inclus dans toutes les pages, il est également utile pour définir d'autres éléments nécessaires sur toutes les pages, comme la redirection vers l'écran de connexion si l'utilisateur n'est pas connecté.