Moin!
ich möchte gerne beim Login in meine Seite eine Session ID generieren und diese soll den Besucher quasi durch meine Seite begleiten.
PHP hat dazu einen wunderbaren Session-Mechanismus geschaffen.
Wird irgendeine Seite ohne Session ID aufgerufen, soll der Gast autom. zum Login kommen.
Falscher Ansatz: Wenn eine Seite ohne _Login_ aufgerufen wird, _dann_ soll man zum Login gelangen. Den Status "eingeloggt" schreibst du in deine Session-Daten.
Klappt auch ganz gut, ich übergebe mit jedem Link die Session ID, die ich beim Login erstellt habe.
session_start();
$sessionid=session_id();
session_register( "UserName" );
<A HREF="link.php?SESSID=$sessionid>Link</A>
Wahnsinnig umständlich. Und veraltet.
Punkt 1: PHP liefert dir die Konstante "SID", welche Session-Name plus Session-ID enthält, sofern der aktuelle Seitenrequest nicht per Cookie diese Daten geliefert hat (wenn Sessions per Cookie möglich sind, ist SID leer).
Verwende also bitte diese Konstante:
echo "<a href="link.php?".SID."">Link</a>";
Punkt 2: Seit PHP 4.1 gibt es die superglobale Variable $_SESSION, in die man Werte einspeichern soll, die per Session auf jeder folgenden Seite wieder erscheinen sollen. session_register() soll nicht mehr verwendet werden.
Ich weiß, normalerweise braucht man die SeeionID nicht extra in die Variable zu packen, hat aber anders nicht geklappt, warum auch immer...
Das ist aber genau der Punkt: Wenn irgendwas nicht geht - warum geht es nicht.
So, kommt der Gast nun auf die Link-Seite, gehts so weiter:
if ($SESSID=="") {
Das hier ist aus zwei Gründen problematisch.
Erstens: Wenn $SESSID als Variable nicht existiert, kriegst du an dieser Stelle eine "Notice", dass du eine undefinierte Variable abfragst. Ja, das kann man abschalten in der PHP-Konfiguration, aber es ist unsauber programmiert.
Zweitens: Du verläßt dich auf das Eingeschaltetsein von register_globals. Das wird aber bei künftigen Servern und PHP-Versionen immer weniger der Fall sein. Verwende die superglobalen Variablen $_GET und $_POST (beide seit PHP 4.1 verfügbar), um auf Werte, die der Browser als URL-Parameter oder POST-Formularwert sendet, zuzugreifen.
Also lieber so:
if (isset($_GET['SESSID'])) {
header("Location: login.php");
Weiterleitungen müssen immer eine absolute URL enthalten, beginnend mit "http://". Der HTTP-Standard schreibt es zwingend vor.
exit;
}
session_start();
$sessionid=session_id();
Unglücklich, dass du zuerst die Session startest und dann die Session-ID setzt. Das wird zu Konflikten führen. Umgekehrt wäre grundsätzlich besser - aber dein Ansatz ist ohnehin schlecht, also lass es gleich wieder.
Klappt prima, aber:
Tja, immer diese "aber"s.
Wenn ich den Link direkt eingebe und denke mir eine Session ID selber aus, also z.B. : www.meiseSeite.de/link.php?SESSID=12345, dann werde ich nicht zum Login geleitet :-(
Logisch. Du fragst ab, ob die Variable $SESSID leer ist. Das ist der Fall, wenn du sie (bei register_globals=on) _nicht_ als URL-Parameter angibst, oder wenn du sie so angibst: "?SESSID=".
Alles andere wird als "nichtleer" bewertet, und du kommst nicht zum Login.
Deswegen ja mein Vorschlag: Schau in den _Sessiondaten_ nach, ob der Benutzer sich schon mal eingeloggt hat. Wenn nein: Redirect zum Login.
Dann mußt du dir auch keinerlei Gedanken mehr um die Session-ID machen. Die ist einfach da und sorgt dafür, dass der nächste Request eines Besuchers dieselben Session-Daten lädt. Ansonsten ist die Session-ID-Verwaltung etc. absolut uninteressant für dich.
Ach ja: Es wäre nicht schlecht, wenn du in die Session-Daten auch noch das aktuelle Datum und Uhrzeit reinschreibst, wenn der Zugriff erlaubt war (also angemeldeter Benutzer etc.). Dann kannst du nämlich am Anfang nicht nur prüfen, ob der Benutzer eingeloggt war, sondern auch, ob er nicht schon zu lange keine Anfrage mehr gestartet hat. Vergessenes Logout ist nämlich auch nicht gut.
- Sven Rautenberg
--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)