Hallo,
ich habe mich in letzter Zeit etwas mit Sessions und einem Login-System beschäftigt, stehe nun aber vor einem – zumindest für mich – etwas seltsamen und unerklärlichen Problem.
Nach dem groben Vorbild des Artikels Sessionbasiertes Loginsystem habe ich eine Funktion zugriffskontrolle(), welche im Großen und Ganzen das gleiche tut wie die Datei „auth.php“ im verlinkten Artikel. Allerdings prüfe ich nicht nur, ob der User eingeloggt ist, sondern auch noch ein paar andere Daten (wie z.B. seit wann er eingeloggt ist), so dass unter Umständen auch ein eingeloggter User zum (erneuten) Login weitergeleitet wird. Da ich möchte, dass man nach dem erfolgreichen Login wieder dorthin zurück gelangt, wo man war, bevor die Zugriffskontrolle beschlossen hat, man müsse sich neu einloggen, habe ich folgenden Code (Ausschnitt aus der Funktion zugriffskontrolle()):
session_unset();
session_destroy(); // Löschen der alten Session
session_name("sessionid");
session_start(); // Neue Session starten, um aktuell angezeigte Seite speichern zu können
$_SESSION['zeigeseite'] = $aktuell_id; // Speichern der ID der aktuell aufgerufenen Kategorie, zu welcher später nach dem Login weitergeleitet werden soll
header("Location: http://".$_SERVER['SERVER_NAME'].linkzuid("login").my_sid(false)); // Die Funktion linkzuid() dürfte nicht weiter relevant sein. my_sid(false) ersetzt einfach nur "/&".SID (wenn keine Cookies aktiviert sind) bzw. ist sonst leer
exit;
Auf der Login-Seite, auf die weitergeleitet wird, wird zunächst wieder
session_name("sessionid");
session_start();
ausgeführt und dann geprüft, ob die angegebenen Login-Daten korrekt sind. Wenn ja, wird $_SESSION['zeigeseite']
ausgelesen und auf die entsprechende Seite weitergeleitet.
Soweit die Theorie. Wenn Cookies aktiviert sind funktioniert das auch einwandfrei. Allerdings tritt trotzdem schon dort die erste für mich seltsame Sache auf: auch nachdem die alte Session gelöscht wurde (session_unset() und session_destroy()) ist die im Cookie gespeicherte Session-ID nach dem Start einer neuen Session die gleiche wie vorher. Hat das seine Richtigkeit so? Sollte nicht eine zufällige neue Session-ID vergeben werden?
Ich meine zwar, einmal etwas gelesen zu haben, dass dieses Verhalten erklären könnte, allerdings kann ich den entsprechenden Text jetzt nichtmehr finden … und irgendwie scheint es mir ein wenig unlogisch.
Der wirklich problematische Teil kommt allerdings erst, wenn Cookies nicht aktiviert sind. Dann habe ich nach der Weiterleitung zur Loginseite nämlich keinen Zugriff mehr auf die vorher gespeicherte Variable $_SESSION['zeigeseite']
. Ich meine auch schon zu wissen, wie es dazu kommt, allerdings nicht, _warum_.
Und zwar ist es (laut der Adresszeile meines Browsers) so, dass bei der Weiterleitung zur Login-Seite noch die alte Session-ID angehängt wird, obwohl davor ja die alte Session zerstört und eine neue Session gestartet wird. Ich rufe darum die Login-Seite mit der alten Session-ID in der Adresszeile auf. Dort wird wieder eine Session gestartet, allerdings scheint PHP nun festzustellen, dass die aktuelle Session-ID nicht mehr gültig ist, denn _jetzt_ wird plötzlich eine neue Session gestartet. Darum ist $_SESSION['zeigeseite']
auch nichtmehr verfügbar. Dass eine neue Session gestartet und nicht die alte fortgesetzt wird, schließe ich einfach aus der neuen Session-ID in der Adresszeile nach dem erfolgreichen Login.
Naja, ich denke meine Frage dürfte offensichtlich sein (zumindest falls die Problembeschreibung verständlich ist): Warum funktioniert es nicht ohne Cookies?
Ich freue mich auf eure Antworten,
viele Grüße,
Claudius