Hauptmenü

Untermenü

PHP/MySQL - Sessions - Die Session-ID

1. Die Abschnitte

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