O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

7 Sessions174
7.3 Session-Speicherung
Das Session-System von PHP speichert die Session-Daten in der
Standardinstallation in dem Verzeichnis, das mit
session.save_path in
der Konfigurationsdatei
php.ini festgelegt wurde. Damit es nicht zu
ungewollten Seiteneffekten kommt, muss jede Applikation ihren eige-
nen Speicherort für die Session-Daten wählen.
session.save_path
Die Speicherung geschieht in einem für Menschen – und auch für
PHP-Skripte – lesbaren Format, nämlich als serialisiertes Array. Mit
der PHP-Funktion
unserialize() können Sie die in Session-Dateien
gespeicherten Daten wieder in ein PHP-nutzbares Array umwandeln.
Das kann fatale Folgen haben, wenn die Session auf einem Mehrbenut-
zersystem, also auf einem Hostingserver o.Ä., angelegt wird – unter
Umständen hat jeder Benutzer über das Dateisystem Zugriff auf die
Sessiondaten anderer Anwender. Sessions können aber auch noch auf
andere Arten gespeichert werden:
im Shared Memory
in einer Datenbank
Falls die Daten unverschlüsselt auf der Festplatte oder in einer Daten-
bank gespeichert werden, kann ein unberechtigter Zugriff nicht hun-
dertprozentig ausgeschlossen werden. Die Suhosin-Extension für PHP
bietet eine Möglichkeit, die Session-Daten automatisch beim Speichern
auf der Festplatte des Webservers zu verschlüsseln, sodass ein Angrei-
fer mit Zugriff auf das Dateisystem die serialisierten Arrays in den Ses-
sion-Dateien nicht mehr einfach auslesen kann. Mehr dazu erfahren
Sie in Kapitel 11.
Daten auf der Festplatte müssen für jeden Benutzer in einem eigenen
Verzeichnis, mit Rechten nur für diesen User gespeichert werden.
/www/users/user12345/tmp
C:\inetpub\users\user12345\temp
Userspezifische
Verzeichnisse
Damit PHP Session-Daten für einen virtuellen Host in einem separaten
Verzeichnis speichert, muss in der Webserver-Konfiguration (in unse-
rem Beispiel Apache) die entsprechende Konfigurationsvariable gesetzt
werden – allerdings geht das nur bei mod_php.
Bei einer CGI-Installation von PHP kann für jeden Benutzer eine
eigene
php.ini angelegt werden, die den session.save_path individuell
speichert, um Session-Daten nach Benutzer oder Kunden zu trennen.
session.save_path = ”/www/KundeA/tmp
session.save_path = ”D:\Kunden\Sessions\KundeA\tmp”
1757.3 Session-Speicherung
Einstellungen in der
php.ini für die Session-
Speicherung
Mehr über benutzerspezifische Konfiguration und die Sicherung einer
PHP-Installation erfahren Sie im Kapitel 9 »PHP intern«.
Haben Sie keinen Zugriff auf die Konfigurationsdateien für Web-
server und PHP, möchten aber dennoch verhindern, dass Ihre Session-
Daten von jedermann gelesen werden können, können Sie die Daten
verschlüsselt auf der Festplatte des Servers ablegen. Das erreichen Sie
durch Überschreiben des Session-Save-Handlers des PHP-Session-Sys-
tems.
Der Session-Save-Handler ist diejenige Funktion, die PHP vorgibt,
auf welche Art und Weise Sessions abgespeichert werden und wie die
Dateiein- und -ausgabe durchgeführt werden soll. PHP bringt einige
Funktionen dafür mit, Sie können aber auch eigene Funktionen schrei-
ben. Praktischerweise können Sie das direkt in PHP tun, müssen also
nicht auf C ausweichen. Ein eigener Session-Save-Handler könnte wie
das nachfolgende Beispiel aussehen. Beachten Sie bei dem Beispiel,
dass es nicht transaktionssicher ist. Das heißt, parallele Requests der
gleichen Session können sich gegenseitig ihre Session-Daten über-
schreiben. Falls Ihre Applikation transaktionssichere Sessions benö-
tigt, muss der Session-Save-Handler entsprechend erweitert werden.
Der Standard-PHP-Session-Save-Handler realisiert dies über File-
Locking.
Eigenes Session-
Speichermodell
entwickeln
<?php
// Funktion zum Öffnen der Session, wird bei
// session_start() aufgerufen
function open($save_path, $session_name){
// Globale Variablen
global $sess_save_path, $sess_session_name;
$sess_save_path = $save_path;
$sess_session_name = $session_name;
return(true);
}
function close(){
return(true);
}
// Funktion zum Lesen
function read($id){
// Globale Variablen
global $sess_save_path, $sess_session_name;
if (preg_match('/^[a-zA-Z0-9]*$/',$id) == false )
die ('Ungueltige Session-ID');
// Pfad zusammenbauen
$sess_file = "$sess_save_path/sess_$id";
7 Sessions176
// Wenn das File existiert, dann auslesen und Daten
// zurückgeben
if ($fp = @fopen($sess_file, "r")) {
// Daten komplett auslesen
$sess_data = fread($fp, filesize($sess_file));
return($sess_data);
} else
// Ansonsten MUSS ein Leerstring zurückgegeben
// werden, da TRUE und FALSE gültige Inhalte sein
// können
return(""); // Hier muss "" zurückgegeben werden
}
// Funktion zum Schreiben
function write($id, $sess_data){
// Globale Variablen
global $sess_save_path, $sess_session_name;
if (preg_match('/^[a-zA-Z0-9]*$/',$id) == false )
die ('Ungueltige Session-ID');
// Pfad zusammenbauen
$sess_file = "$sess_save_path/sess_$id";
// Datei zum Schreiben öffnen
if ($fp = @fopen($sess_file, "w"))
// Daten komplett reinschreiben
return(fwrite($fp, $sess_data));
else
return(false);
}
// Wird am Ende des Skriptes oder bei session_destroy()
// aufgerufen
function destroy($id){
global $sess_save_path, $sess_session_name;
// Pfad zusammenbauen
$sess_file = "$sess_save_path/sess_$id";
// Datei löschen
return(@unlink($sess_file));
}
// Speicherbereinigung
function gc($maxlifetime)
{
return true;
}
session_set_save_handler("open", "close", "read", "write",
"destroy", "gc");
session_start();
?>

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required