PHP-Session verstehen und anwenden?

psdler

Mitglied
Hey ihr Lieben,
ich versuche mich gerade an einem User-Bereich der mit Sessions funktionieren soll.
Der User meldet sich an, User wird aus DB verglichen, die Anmeldung und alles funktioniert soweit. Wenn sich der User anmeldet, wird eine Session gestartet:

PHP:
// Session starten
if ($url != "login")
	{ 
session_start();
session_name();
$PHPSESSID = session_id();
	}

Das steht in einer "header.php", die auf jeder Seite automatisch eingebunden wird (mit Stylesheets, etc.), ausser eben auf der login-Seite (login.php ist so zu sagen das ausführende Script vom Anmeldeformular).

Die Session wird dann in einer Spalte in der DB "PHPSESSID" hinter den jeweiligen User eingetragen:
Code:
$sql = "UPDATE user
              SET PHPSESSID = '" . $PHPSESSID . "'
              WHERE username = '" . $username . "'
             ";


Mein Problem ist jetzt folgendes:
Ich will, dass der Benutzer, der sich eingeloggt hat und eine Session-Id erhalten hat auf jeder Seite erstmal automatisch überprüft wird, ob er die Seite sehen darf - bzw ob die Session-Id, mit der er surft, auch der der in der DB steht über ein stimmt.
Anders rum: Hat der User nicht die SESSION-Id aus der DB, darf er die Seiten nicht sehen, auf die er will.

Ich muss, um das Problem zu verstehen und selber zu lösen erstmal verstehen die eine Session funktioniert.
Kann ich in eine Session rein schreiben User-XY hat ID XY und das wird auf jeder Seite weiter gegeben (möchte auch auf den Seiten den Username per Variable einbinden können, dass z.B. dran steht "Hallo $user - willkommen!").

Wie muss ich das anstellen, dass auf jeder Seite gefragt wird "hat er diese ID, wenn ja, weiter, wenn nein Weiterleitung auf login-Seite".

Vielen Dank im Voraus,
ich hoffe ihr versteht mein Problem,
Grüße

psdler
 
Hallo,

also erstmal, du musst auf JEDER Seite, auf der Session-Inhalte verfügbar sein sollen (eigentlich auf jeder) zu mindest mal session_start() aufrufen. Dieser Befehl tut mehrere Dinge:

- Er prüft, ob unter dem Client-Identifier, den der Browser mit sendet (in der Regel ein Session-Cookie) schon mal eine Session eröffnet wurde.
- Wenn dem so ist, wird die Session wieder aufgenommen.
- Wenn nicht, wird eine neue Session erzeugt und dem Client ein Session-Cookie zugewiesen (das ist auch der Grund, warum session_start() aufgerufen werden muss, bevor irgendwelche sonstigen Daten z.B. durch echo() an den Browser gesendet werden)
- Wenn in der bereits vorhandenen Session Daten abgelegt wurden, werden diese wieder hergestellt und in der Superglobalen $_SESSION verfügbar gemacht.
- Die gespeicherten Daten werden beim Beenden des Scriptlaufs zurück in eine Datei (oder in ein anderes persistentes Medium) gespeichert, meistens durch die sog. Serialisation mittels serialize()-Befehl. Das Widerherstellen wird in der Regel mittels unserialize()-Befehl abgewickelt.

Du hast jetzt in deinem Code also vor allem das Problem, das die Session nur gestartet wird, wenn die URL eine bestimmte Adresse hat. Die Session muss aber jederzeit gestartet werden - auch wenn der Befehl etwas anderes vermuten lässt. Wenn du das nicht machst, wird die Session auf den Seiten, die der URL nicht entsprechen, nicht verfügbar sein und demzufolge auch keine darin gespeicherten Daten.

Du kannst nach dem Login die Benutzer-ID in der Session folgendermaßen ablegen:

PHP:
session_start(); // Muss immer gerufen werden

// etlicher anderer Code + HTML + CSS + JS + $whatever
// include(....);

/** Dieser Code prüft, ob ein Benutzer sich eingeloggt hat und legt bei Erfolg die Benutzer-ID in der Session ab ***/
if( $loginErfolgreich )
{
  $_SESSION['user_id'] = $benutzer_id_aus_der_datenbank;
}

// Jetzt kannst du jederzeit nachprüfen, ob eine gültige Benutzer-ID in der Session abgespeichert wurde.
/*** Dieser Code könnte in eine separate Datei ausgelagert und überall dort, wo notwendig inkludiert werden ***/
if( ! ist_valide_user_id( $_SESSION['user_id'] )
{
  header('Location: login.php');
  die();
}

// Hier die Ausgabe machen, die nur ein eingeloggter Benutzer sehen darf.

Ich hoffe, es ist einigermaßen verständlich erklärt.
 
Zuletzt bearbeitet:
Hallo psdler,

schau mal hier im Tutorialbereich Link
Damit habe ich damals die besten Erfahrungen gemacht.

Ich habe es damals mit einer Einstufung der Rechte realisiert und bei einem Seitenaufruf wurde dementsprechend die Stufe aus der Session abgefragt und demnach das Menü aufgebaut. Auf jeder Seite sollte dennoch seperat abgefragt werden, um einen direkten Aufruf zu vermeiden.

Auf ständige Abfrage aus der Datenbank habe ich verzichtet um die Laufzeit gering zu halten.

Solang du auf jeder Seite mit session_start(); beginnst bleibt die Session erhalten und du kannst daraus abfragen.

Ich hane z.B. den Namen und sonstiges auch in Sessions abgelegt und habe darauf immer wieder zugegriffen.

Aus Sicherheitsaspekten ist meine Lösung aber bestimmt nicht die beste....

Gruß Drade
 
Zurück