php Logo

Paul Ferd. Siegert Datenbankgestützte Webseiten

 
Session handling

Allgemeines

Mit HTML Formularen, einem PHP Programm und einer Nutzerdatenbank lässt sich schnell eile Loginprozedur schreiben. Das Problem dabei ist, das der Login bei der nächsten Serveranfrage des Clients wieder "vergessen" ist. Der Server kann, da HTTP ein zustandsloses Protokoll ist, nicht erkennen ob eine Anfrage vom selben Client oder von einem neuen Nutzer erfolgt.

Lösungswege:

  • Ungeeignet ist die Unterscheidung anhand der IP-Nummern. Dynamisch zugewiesene IPs (DHCP) bei Internetprovidern können nicht garantieren, dass eine Anfrage mit einer bestimmten IP-Adresse immer vom selben Rechner kommt.
  • Geeignet ist also nur die ständige Übergabe einer Session-ID zwischen Browser und Server, anhand der die Quelle der Anfrage identifiziert werden kann.

Eine Session hat stets eine ID, anhand der sie unterschieden werden kann und verschiedene Inhalte (Variable), die mit ihr gespeichert werden. Die Speicherung der Inhalte kann alternativ an zwei Stellen erfolgen, je nach der Einstellung der Servers bzw. des Clients:

  • als Cookies auf dem Client oder als
  • File auf dem Server

Die Sessionverwaltung ist ein eigenes Modul in PHP und kann mit Hilfe der php.ini konfiguriert werden. Folgende Felder stehen zur Verfügung:

Parameter Beschreibung
session.save_handler=files Für die Speicherung der Sessions werden files verwendet (default Einstellung). Alternativ: mm zur Verwendung des Arbeitsspeichers.
session.save_path=/tmp Pfad für das Speichern der Sessions
session.use_cookies=1 Standardmässig werden Cookies verwendet. Nur wenn der Client die Cookies abgestellt hat wird auf dem Server gespeichert.
session.name=PHPSESSID Name der Sessionvariablen bzw. des Cookies
session.auto_start=0 Startet das Session Modul bei jedem Request automatisch
session.cookie_lifetime=0 Lebesdauer der Cookies (0 bedeutet bis zum nächsten Browserstart)
session.gc_maxlifetime=1440 Zeit nach der alle Sessiondaten zerstört werden.
session.use_trans_sid=0 Transparente Session Unterstützung

Befehle

Session anlegen

Beim Start einer Session wird geprüft ob sie vorhanden ist oder nicht. Wenn nicht, wird sie angelegt. Dies geschieht mit

session_start();

Die Session kann ausgelesen werden mit

session_name();

session_id();

gelöscht wird sie mit

session_destroy();



Hinzufügen von Variablen

Zum Anlegen von Vatiablen in der Session wird der Name der Variable (nicht die Variable selbst!) übergeben.

$_SESSION['variablenname'] = "text";

löschen der Variablen

session_unregister('variablenname');

um zu testen ob die Variable bereits existiert

session_is_registered('variablenname');



Serialisieren

serialisieren von Daten (z.B. Arrays)

session_encode();

und deserialisieren

session_decode();


Weitergabe des Sessions

Zuerst versucht das Modul die Session ID im Cookie abzulegen, wenn der Client dies zulässt und der Server entsprechend konfiguriert ist.

Die Session ID wird an jeden im HTML-Dokument bedindlichen Link angehängt und in jedes Formular als hidden-Field eingefügt. Der Programmierer braucht sich darum nicht kümmern.

Bei Weiterleitungen mit der header()-Funktion, wie auch in JavaScript Funktionen, muss man sich um das Anhängen der Session-ID selbst kümmern.

session_start();
$name = session_name();
$id = Session_id();
header("Location: datei.php?$name=$id");


Beispiel


################################ INDEX.HTML

<html>
	<head>
		<title>
			login
		</title>
	</head>

	<body>
		<form action="ausgabe1.php" method="post">
			Account: <input type="text" name="account"><br>
			Passwort: <input type="password" name="passwort"><br>
			<input type="submit" name="log-in"><br>
		</form>
	</body>
</html>

################################ AUSGABE1.PHP

<? session_start(); ?>

<html>
	<head>
		<title>
			session anlegen
		</title>
	</head>

	<body>
		<?
		$passwort = $_POST['passwort'];
		$account = $_POST['account'];
				
		$name = session_name();
		$id = session_id();
		echo $name."=".$id."<br>";
		
		$_SESSION['passwort'] = $passwort; 
		$_SESSION['account'] = $account;
		?>
	<hr><a href="ausgabe2.php">weiter</a>
	</body>
</html>

################################ AUSGABE2.PHP

<? session_start(); ?>
<html>
	<head>
		<title>
			ausgabe2
		</title>
	</head>

	<body>
		<?
		$passwort = $_SESSION['passwort'];
		$account = $_SESSION['account'];
		
		echo "Hier der Zugang:<br>";
		
		echo 'Account: '.$account."<br>";
		echo 'Passwort: '.$passwort."<br>";
		
		
		?>
		<hr><a href="ausgabe3.php" target="_blank">weiter</a>
	</body>
</html>

################################ AUSGABE3.PHP

<? session_start(); ?>
<html>
	<head>
		<title>
			ausgabe2
		</title>
	</head>

	<body bgcolor="#AAFFAA">
		<?
		$passwort = $_SESSION['passwort'];
		$account = $_SESSION['account'];
		
	
		echo "Hier der Zugang:<br>";
		
		echo $account."<br>";
		echo $passwort."<br>";
		
		session_destroy();
		
		?>
		<hr><a href="ausgabe2.php">weiter</a>
	</body>
</html>