Warum wird meine PHP-Sitzung nicht gespeichert, wenn ich Webseiten durchsuche?
Ich erstelle eine Website, die ein einfaches Benutzername-Passwort-Paar verwendet, um Administratoren die Authentifizierung auf der Anmeldeseite zu ermöglichen. Dazu wird zunächst eine Sitzung erstellt, wenn der Benutzer die Startseite erreicht. Wenn er dann auf die Schaltfläche „Anmelden“ klickt, wird er zu einem Formular zur Eingabe des Benutzernamens und des Passworts weitergeleitet. Anschließend wird das Formular über die POST-Methode an ein anderes Formular gesendet Um den Benutzernamen und das Passwort zu überprüfen. Wenn die Seite gültig ist, fügen Sie eine Variable in die Sitzung ein, die den Benutzernamen des angemeldeten Administrators enthält, und leiten Sie dann zum Administrator-Dashboard weiter. Überprüfen Sie, ob die Variable gesetzt ist, um zu überprüfen, ob es sich tatsächlich um einen Administrator auf der Seite handelt.
Wie im Titel erklärt, besteht das Hauptproblem darin, dass beim Testen der Homepage zwar eine Sitzung erstellt wird, aber wenn ich auf den Link zum Anmeldeformular klicke, scheint die Sitzung zerstört zu sein, obwohl ich alles entferne oder neutralisiere, was möglicherweise der Fall ist verursacht diese Anweisungen.
Kleines PHP-Snippet (main.php) auf der Homepage zum Starten der Sitzung
<?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"); } ?>
Ich habe versucht, den Cookie-Lebenszyklus wie oben gezeigt zu überschreiben, um einen Ausschnitt der Antwort auf diese Frage zu erhalten und zu sehen, ob der Ordner beschreibbar war und ob die Sitzung erstellt wurde. Das Protokoll kehrt immer zur Startseite zurück:
Test de session : 2 | 1684946314; Session path C:\MAMP\bin\php\sessions\ is writable for PHP;
(Die erste Zeile | die Zahl danach ist der erwartete Zeitstempel).
Der einzige PHP-Codeausschnitt im Anmeldeformular (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"); } ?>
Ich habe dort das erste „Wenn“ eingefügt, um angemeldete Administratoren direkt zum Dashboard umzuleiten, wenn sie bereits verbunden sind. Die folgenden Zeilen führen den gleichen Test wie in main.php durch, aber dieses Mal wird im Protokoll Folgendes zurückgegeben:
Test de session : 1 | ; Session path C:\MAMP\bin\php\sessions\ is writable for PHP;
Dies zeigt an, dass die Sitzung zerstört wurde und alle ihre Variablen nicht gesetzt sind.
Teil des Codes in der PHP-Datei, der für die Überprüfung des angegebenen Benutzernamens und Passworts im Zusammenhang mit der Sitzungsnutzung verantwortlich ist (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."; ?>
Das Protokoll, das durch die Ausführung der Datei nach dem Absenden des Formulars zurückgegeben wird:
------- [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]
Da ich die registrierten Administratoranmeldeinformationen in das Formular eingegeben hatte, war die Authentifizierung selbst erfolgreich, aber nachdem ich auf das Anmeldeformular geklickt hatte, stellte sich heraus, dass die auf der Startseite erstellte Sitzung immer noch gelöscht war, sodass ich den Benutzernamen nicht eingeben konnte $_SESSION Angemeldete Administratoren im Array.
if-Struktur verhindert, dass nicht autorisierte Benutzer auf Dashboard-Inhalte zugreifen, die nur für Administratoren bestimmt sind (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.
Auszüge aus zwei Konfigurationsdateien von PHP-Komponenten, die auf meinem Server (PHP 8.1.0) verwendet werden
php.ini-Entwicklung
... ; ; 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-produktion
; ; 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/"Der Parameter
session.save_path ist in beiden offenbar unkommentiert. Es handelt sich jedoch nicht um den Pfad, der von der Funktion session_save_path() zurückgegeben wird.
https://www.php.net/manual/en /function.session-start.php
每次加载新页面时,都是不同的 HTTP 请求。会话必须在每个 HTTP 请求上启动,因此,您必须将
session_start()
添加到每个页面。我建议创建一个包含在所有页面中的单个标头文件,它对于设置所有页面上所需的其他内容也很有用,例如如果用户未登录则重定向到登录屏幕.