PHP Sessions
Sie befinden sich: Home > Php > PHP
Sessions
In diesem Tutorial möchte ich ihnen erklären
wie Sie Sessions in PHP benutzen können. Die
Sessions werden sehr häufig dazu verwendet,
um einen Memberbereich beziehungsweise Administrationsbereich
zu realisieren. Da nur der User einen Zugriff auf
die Session bekommt, den die Session ID bekannt ist.
Dadurch ist es möglich individuellen Inhalt für einen
User bereit zu stellen oder diesen mit ein Passwortschutz
zu versehen. In PHP wird über den Befehl session_start() eine
neue Session generiert.
Wird den Befehl session_start() die Session
ID übergeben, greift der Server auf die hinterlegte
Datei zu. Wenn eine Session generiert wird, wird
ein Text File unter den session.save_path generiert.
Den Session Save_Path kann man mit den Befehl session_save_path() ändern.
Dazu muss der Befehl vor session_start() ausgeführt
werden. Dieses Text File wird unter den Dateinamen
Prefix "sess_" und 32 zufällige Zeichen
gespeichert. Die 32 Zeichen ist die aktuelle Session
ID, dadurch weiß der Server, welche Datei genutzt
werden soll. In diesem Text File werden alle Variablen
serialsiert gespeichert, die in der aktuellen Session
generiert wurden.
Eine Session ist standardmäßig 180 Minuten
aktiv, wenn bis dahin die Session nicht wieder benutzt
wurde, wird standardmäßig das Text File
der Session gelöscht. Dies ist abhängig
von der Einstellung in der php.ini unter session.cache_expire.
Der Wert session.cache_expire definiert
die Ablaufzeit der Session. Man kann auf Wunsch mit new_cache_expire() diesen
Wert ändern.
So nunr ein Beispiel zum Starten einer Session:
<?php
session_start();
?>
Der Befehl session_start() sollte immer
in der ersten Zeile eines PHP Scriptes stehen. Der
Befehl session_start() gibt true oder false
zurück. Sollte die Session nicht gestartet werden
können, wird ein false zurückgegeben. Zusätzlich
muss der Befehl vor den senden des Http Header vom
Dokument ausgeführt werden, da ansonsten eine
entsprechende Fehlermeldung kommt und nicht auf die
Session zugegriffen werden kann. Daher ist es empfehlenswert
mit dem Befehl headers_sent() zu prüfen
ob der http Header bereits gesendet wurde.
Man kann alternativ ein @ Zeichen vor dem Befehl session_start() setzen,
dadurch vermeidet man eine eventuelle Fehlerausgabe.
Damit gegebenenfalls ein Angreifer den Fehler von
einer falsch aufgerufenen Funktion nicht zu Gesicht
bekommt. Ich würde an dieser Stelle empfehlen
mit dem Befehl headers_sent() zu prüfen,
ob bereits ein Http Header gesendet wurde und vor session_start() ein
@ Zeichen zu setzen.
Beispiel zum prüfen, ob bereits ein http Header
gesendet wurde:
<?php
// prüfen ob der HTTP header bereits gesendet wurde
if (headers_sent() == false) {
// HTTP header wurde noch nicht gesendet
@session_start();
}
?>
Nachdem wir nun die Session initialisiert haben,
können wir damit beginnen diese mit Inhalt zu
befüllen. Hierzu nutzen wir die Servervariable $_SESSION,
in dieser werden so genannte Array Elemente
abgelegt. Wenn wir nun ein neuen Schlüssel mit
einem Wert generieren möchten, müssen wir
folgendermaßen die Servervariable ansprechen.
<?php
if (headers_sent() == false) {
@session_start();
// Nun erstellen wir in der Session ein Schlüssel mit
einen Wert
$_SESSION['username'] = 'Nico Schubert';
}
?>
Wie oben in unserem Beispiel geschrieben, haben wir
den Schlüssel "username" mit dem Wert "Nico
Schubert" in unserer Session Array: $_SESSION
gespeichert. Wenn der Browser Cookies zulässt, wird
nun ein Cookie mit der Session ID gespeichert. Nun
könnten wir in einer weiteren Seite mit diesen
Schlüssel den Inhalt der Session ausgeben. Da
nicht immer sichergestellt werden kann, das die Session
ID per Cookie gespeichert wird. Sollte man die Session
ID über die Konstante SID oder session_id() per GET oder POST übergeben.
Nachfolgend ein Beispiel für die Übergabe:
<?php
if (headers_sent() == false) {
@session_start();
// Nun erstellen wir in der Session ein Schlüssel mit einen
Wert
$_SESSION['username'] = 'Nico Schubert';
}
?>
Hier das Beispiel für die Ausgabe. Bitte Speichern
Sie die Datei mit den Dateiname: seite2.php
<?php
if (headers_sent() == false) {
if (!isset($_GET['PHPSESSID'])) $_GET['PHPSESSID'] = '';
if ($_GET['PHPSESSID'] != '') {
@session_start($_GET['PHPSESSID']);
} else {
@session_start();
}
if (!isset($_SESSION['username'])) $_SESSION['username']
= '';
if ($_SESSION['username'] != '') {
echo 'Ihr Username ist: '.$_SESSION['username'];
} else {
echo 'Es konnte kein Usernamer ermittelt werden.';
}
}
?>
Erklärung: In der ersten Zeile
prüfen wir ob bereits der HTTP Header gesendet
wurde. Wenn dieser noch nicht gesendet wurde, prüfen
wir mit isset() ob
die GET Variable: $_GET['PHPSESSID'] gesetzt
wurde, ansonsten machen wir diese Variable den PHP
Script bekannt. In der nächsten Zeile prüfen
wir, ob die Variable: $_GET['PHPSESSID'] einen
Wert enthält. Wenn die Variable einen Wert enthält,
starten wir in der nächsten Zeile mit diesen
Wert unserer Session.
Sollte kein Wert in $_GET['PHPSESSID'] enthalten
sein, starten wir normal ohne Übergabe der Session
ID, die Session. Im nächsten Abschnitt prüfen
wir, ob die Variable: $_SESSION['username'] bereits
einen Wert enthält, ansonsten machen mir diese
Variable den PHP Script bekannt. Nun prüfen
wir ob die Variable: $_SESSION['username'] einen
Wert enthält und geben diesen Wert aus.
Hinweis: Man sollte bei
diesem Beispiel eine IP Überprüfung einbauen,
da ansonsten jeder auf die Session zugreifen kann.
Empfehlenswert wäre die IP Adresse in der Session
zu speichern und dann wieder zu prüfen, ob diese
existiert.
Es wird hier erklärt, wie man in PHP
eine IP Adresse ermittelt. Anschließend
prüft man mit einer so genannten IF-Anweisung ob
die IP Adresse in der Session enthalten ist. Zusätzlich
kann man mit session_regenerate_id() auch
ab und zu im Scriptlauf die Session ID mal ändern,
dies erhöht die Sicherheit.
Wenn Sie die Session Variable wieder löschen
möchten,
können Sie hierzu unset() oder session_destroy() verwenden. Sie können das gesamte Transport
Script
hier herunterladen.
Soweit alles klar? Wenn ja, so können Sie hier das
nächste Thema anfangen. Dabei geht es darum, einen
lokalen Entwicklungsserver einrichten. |