PHP/MySQL - Sessions - Die Session-ID
1. Die Abschnitte
- Überblick
- Eine Session starten
- Eine Session füllen
- Eine Session killen
- Die Session-ID
- Generelle Tipps
2. Ein Hinweis
Für das folgende Beispiel solltet ihr auf jeden Fall das Setzen von Cookies verbieten. Im Firefox läuft das über "Extras -> Einstellungen -> Datendschutz -> Cookies akzeptieren". Wer einen anderen Browser hat, muss das leider selber herausfinden. Sorry, will das hier nicht bis ins Detail auswälzen. Das ist eigentlich Grundlagenwissen fürs Internet.
3. Cookies = Off
Wie ich schon eingangs sagte, basieren Sessions unter anderem auch auf Cookies. Was ist aber wenn die einer deaktiviert hat? Nun, dafür gibt es eine so genannte Fallback-Lösung. Denn wenn kein Session-Cookie gesetzt werden kann, so hat man automatisch Zugriff darauf. Dabei gibt es zwei Möglichkeiten.
4. session_id()
Damit bekommt man die ID einer Session heraus. Und zwar völlig unabhängig davon, ob nun ein Cookie gesetzt werden konnte oder nicht.
// ergibt zum Beispiel 17749db28a35dc6be85b3fdb82cdbcfd
echo session_id();
Damit kann man sich nun einen Link zusammenbauen, mit der diese ID jedes Mal durchgeschleift wird. Also so.
echo '<a href="bla.php?PHPSESSID='.session_id().'">';
Wichtig dabei ist, dass man als Namen für den Parameter den Wert nimmt, der über session.name
vorgegeben ist. Leider ist diese
Vorgehensweise nicht so prickelnd und obendrein überflüssig, wenn der Besucher Session-Cookies aktiviert hat. Darum gibt es noch eine
elegantere Lösung.
5. SID
Diese Konstante bekommt nur dann einen Wert, wenn kein Session-Cookie gesetzt werden kann. Dabei handelt es sich um einen String, der sowohl
den Wert von session.name
als auch die eigentlich ID enthalt. Dazwischen gibt es noch ein schönes Gleichheitszeichen, so
dass man einen kompletten GET-Parameter hat.
// Ergibt zum Beispiel PHPSESSID=f0ab5c1d9453dc6a29dedb3cf56f24ef
echo SID;
Und darauf lässt sich dann wunderbar ein Link basteln.
echo '<a href="bla.php?'.SID.'">';
Aber!
Da man nie genau weiß, ob nun jemand Cookies erlaubt oder nicht, sollte man, wenn man zusätzliche GET-Parameter durchschleifen will, die
Konstante SID
immer an das Ende des Links setzen. Denn sonst hat man sehr leicht einen Bruch in der Parameterkette.
// SID immer schön brav ans Ende
echo '<a href="bla.php?blubb='.$blubb.'&bls='.$bla.'&'.SID.'">';
Oder man baut sich eine Bedingung zusammen.
$id = SID;
if (!empty($id)) {
$param = '&'.$id;
}
else {
$param = '';
}
echo '<a href="bla.php?blubb='$blubb.'&bls='.$bla.$param.'">';
Erläuterung
Dieser Code mag euch ein wenig seltsam vorkommen. Einige denken sicher, dass eine Bedingung à la if(SID)
doch völlig
ausreicht. NÖ! Tut es nicht! Warum? Nun, das habe ich bei der PHP-Theorie unter dem Abschnitt
Konstanten (Punkt 5) schon erklärt. Wenn eine Konstante nicht gesetzt ist und man versucht
trotzdem, auf sie zuzugreifen, so nimmt PHP als Wert den Namen der Konstanten. Und darum muss man so vorgehen, wie oben beschrieben.
6. session.use_trans_sid
Das habe ich euch bisher verschwiegen. Wenn also jemand Cookies deaktiviert hat und diese Einstellung in der php.ini
auf On (oder 1) steht, so wird die SID
automatisch an jede URL im Code angehängt.
Ausnahmen
... sind Formulare, da wird die SID
automatisch in ein hidden
-Feld geschrieben. Und bei Weiterleitungen per
header
passiert gar nichts. Da muss man das händisch erledigen.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt