Meine Website hat einen geschützten Mitgliederbereich. Die Login-Kontrolle erfolgt über Sessions. Durch unvollständig aktualisierte Mitgliederprofile habe ich bemerkt, dass bei einigen Usern anscheinend der Login-Status von einer auf die andere Seite verloren geht. Der User ist also plötzlich ausgeloggt. Um der Sache auf die Spur zu kommen, habe ich ein Fehler-Script eingebaut. Aber das machte es für mich nur noch verwirrender. Das Ergebnis stelle ich hier mal dar.
Etwas viel Text, aber ich denke, man kann da durchsteigen.... Würde mich sehr über Hilfe freuen!
Login-Seite: Nach erfolgreichem Login wird folgende Session erzeugt:
mid ist die Mitglieds-ID, es werden außerdem noch Vor- und Zuname sowie E-Mail-Adresse gespeichert.
Auf jeder Seite im Mitgliederbereich wird jetzt zur Authentifizierung das Script session_control.php aufgerufen.
Auf diese Seiten kann man eigentlich nur gelangen, wenn man korrekt eingeloggt ist, die Session-ID gesetzt wurde und Cookies nicht deaktiviert sind.
Trotzdem kommen selten, aber regelmäßig Fehler vor. Ich lasse deshalb error_log.php aufrufen, um mir Seitenname, SID und Inhalt der Session per Mail zusenden zu lassen:
Zu einer Fehlermeldung habe ich mir die entsprechenden Seitenaufufe aus den Logfiles herauskopiert (darunter zweimal die Fehler-Mail, die durch die vorherige Seite erzeugt wurde) um der Sache auf die Schliche zu kommen. Aber nun wird es nur immer verwirrender:
Zur Erläuterung:
Der User besucht die Startseite des Mitgliederbereichs (1), muss sich aber erst noch einloggen: via POST (2)
Login anscheinend erfolgreich, denn der User gelangt auf die geschützte Seite 'manager.php' (3)
Der User möchte nun sein Mitgliederprofil bearbeiten (4)(5)(6). Dies erfolgt mit den drei Seiten mit den Endungen _add1.php (Formular), _data1.php (Verarbeitung der Formulardaten, dann Header-Weiterleitung zur nächsten Seite), _result1.php (Anzeige der Änderungen für den User)
Weil mit der Header-Weiterleitung öfter Cookies verloren gingen (Warum konnte mir auch noch keiner erklären), habe ich hier die zusätzliche Übergabe der SID via GET erzwungen.
Der User geht jetzt über einen Link zu einer weiteren Seite um bestimmte Mitglieder-Daten zu aktualisieren (7). Hier tritt der erste Fehler auf:
In der Fehler-Mail sieht man, dass die ursprüngliche Session-ID (die mit "934.." beginnt), offenbar beim Übergang von (6) zu (7) verlorengegangen ist.
Durch session_start(); wurde eine neue SID erzeugt ("d32.."), die natürlich noch leer ist. Somit ist login=0, dem User wird eine Fehlermeldung angezeigt, das Script bricht ab.
Der User geht nun zurück zur index-Seite (8 ), loggt sich erneut ein und versucht es noch einmal (10)(11)(12). Er kommt diesmal auch etwas weiter, erst bei der result-Seite tritt der Fehler wieder auf.
Nun aber das Mysteriöse: Bei (12) taucht in der URL plötzlich wieder die ursprüngliche SID ("934...") auf, die ja eigentlich schon gelöscht und durch ("d32..") überschrieben wurde. Wie kann das sein? Können für einen User zwei SID angelegt werden?? (einer über GET, einer über Cookies??). Oder habe ich hier was grundlegendes übersehen? Diese Fehler kommen wie gesagt nur bei einigen Usern vor, aber trotzdem nicht gerade selten.
Etwas viel Text, aber ich denke, man kann da durchsteigen.... Würde mich sehr über Hilfe freuen!
Login-Seite: Nach erfolgreichem Login wird folgende Session erzeugt:
PHP-Code:
session_start();
$_SESSION["login"] = 1;
$_SESSION["fname"] = $fname;
$_SESSION["lname"] = $lname;
$_SESSION["email"] = $email;
$_SESSION["mid"] = $mid;
Auf jeder Seite im Mitgliederbereich wird jetzt zur Authentifizierung das Script session_control.php aufgerufen.
Auf diese Seiten kann man eigentlich nur gelangen, wenn man korrekt eingeloggt ist, die Session-ID gesetzt wurde und Cookies nicht deaktiviert sind.
Trotzdem kommen selten, aber regelmäßig Fehler vor. Ich lasse deshalb error_log.php aufrufen, um mir Seitenname, SID und Inhalt der Session per Mail zusenden zu lassen:
PHP-Code:
<?php
// zu schützende Seite
error_reporting(E_ALL);
include("../inc/connect.php");
include("../inc/session_control.php");
if ( $login <> 1 ) {
include("../inc/error_log.php"); exit(); }
...
?>
PHP-Code:
<?php
// Seite session_control.php
session_start();
if ( isset($_SESSION['login']) ) {
$mid = $_SESSION['mid'];
$fname = $_SESSION['fname'];
$lname = $_SESSION['lname'];
$email = $_SESSION['email'];
$login = $_SESSION['login']; }
else {
$mid = 0;
$fname = "error";
$lname = "error";
$email = "error";
$login = 0; }
$ssid = session_id();
?>
PHP-Code:
<?php
// Seite error_log.php
$url = $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
$print = print_r($_SESSION, true);
@mail ("xxx @ xxx.de","ranking LOGIN ERROR","
Seite: $url
SID: $ssid
$print
Login: $login
MID: $mid
Name: $fname $lname
","From: mail@ xxx.de");
echo "Error: Login invalid";
?>
Zu einer Fehlermeldung habe ich mir die entsprechenden Seitenaufufe aus den Logfiles herauskopiert (darunter zweimal die Fehler-Mail, die durch die vorherige Seite erzeugt wurde) um der Sache auf die Schliche zu kommen. Aber nun wird es nur immer verwirrender:
Code:
(1) "GET /members/index.php HTTP/1.1" (2) "POST /members/index.php HTTP/1.1" (3) "GET /ranking/manager.php HTTP/1.1" (4) "GET /ranking/ticks_add1.php HTTP/1.1" (5) "POST /ranking/ticks_data1.php HTTP/1.1" (6) "GET /ranking/ticks_result1.php?PHPSESSID=934c41d34409233d7354a1043107a81d&new=1&dir=1 HTTP/1.1" (7) "GET /ranking/sites_add1.php?sort=0 HTTP/1.1" =>FEHLER 1 ------------ FEHLER 1: Seite: /ranking/sites_add1.php?sort=0 SID: d328f464fb8e90dd25e6238a4727af78 Array ( ) Login: 0 MID: 0 Name: error -------------- (8) "GET /members/index.php HTTP/1.1" (9) "GET /ranking/manager.php HTTP/1.1" (10) "GET /ranking/sites_add1.php HTTP/1.1" (11) "POST /ranking/sites_data1.php HTTP/1.1" (12) "GET /ranking/sites_result1.php?PHPSESSID=934c41d34409233d7354a1043107a81d&sort=1&start=100 HTTP/1.1" =>FEHLER 2 ------------ FEHLER 2: Seite: /ranking/sites_result1.php?PHPSESSID=934c41d34409233d7354a1043107a81d&sort=1&start=100 SID: d328f464fb8e90dd25e6238a4727af78 Array ( ) Login: 0 MID: 0 Name: error ------------
Der User besucht die Startseite des Mitgliederbereichs (1), muss sich aber erst noch einloggen: via POST (2)
Login anscheinend erfolgreich, denn der User gelangt auf die geschützte Seite 'manager.php' (3)
Der User möchte nun sein Mitgliederprofil bearbeiten (4)(5)(6). Dies erfolgt mit den drei Seiten mit den Endungen _add1.php (Formular), _data1.php (Verarbeitung der Formulardaten, dann Header-Weiterleitung zur nächsten Seite), _result1.php (Anzeige der Änderungen für den User)
Weil mit der Header-Weiterleitung öfter Cookies verloren gingen (Warum konnte mir auch noch keiner erklären), habe ich hier die zusätzliche Übergabe der SID via GET erzwungen.
Der User geht jetzt über einen Link zu einer weiteren Seite um bestimmte Mitglieder-Daten zu aktualisieren (7). Hier tritt der erste Fehler auf:
In der Fehler-Mail sieht man, dass die ursprüngliche Session-ID (die mit "934.." beginnt), offenbar beim Übergang von (6) zu (7) verlorengegangen ist.
Durch session_start(); wurde eine neue SID erzeugt ("d32.."), die natürlich noch leer ist. Somit ist login=0, dem User wird eine Fehlermeldung angezeigt, das Script bricht ab.
Der User geht nun zurück zur index-Seite (8 ), loggt sich erneut ein und versucht es noch einmal (10)(11)(12). Er kommt diesmal auch etwas weiter, erst bei der result-Seite tritt der Fehler wieder auf.
Nun aber das Mysteriöse: Bei (12) taucht in der URL plötzlich wieder die ursprüngliche SID ("934...") auf, die ja eigentlich schon gelöscht und durch ("d32..") überschrieben wurde. Wie kann das sein? Können für einen User zwei SID angelegt werden?? (einer über GET, einer über Cookies??). Oder habe ich hier was grundlegendes übersehen? Diese Fehler kommen wie gesagt nur bei einigen Usern vor, aber trotzdem nicht gerade selten.
Kommentar