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

11 PHP-Hardening260
11.5 Konfiguration
Wie bereits oben erwähnt, sollten Sie Suhosin auf jeden Fall per
php.ini (oder, falls Sie mod_php benutzen, innerhalb der VirtualHost-
Blöcke) konfigurieren. Da die Liste der Features ständig wächst, exis-
tieren eine ganze Reihe von Konfigurationsoptionen, von denen im
Folgenden nur eine Teilmenge erklärt werden kann. Eine vollständige
Liste und Dokumentation aller Optionen finden Sie jederzeit auf der
Webseite zu Suhosin
5
. Die Konfiguration lässt sich in einige syntak-
tisch nicht zusammenhängende Sektionen unterteilen:
Generelle Optionen
Protokollierung und Log-Dateien
Transparente Verschlüsselung
Variablenfilter
Upload-Konfiguration
Jede dieser Sektionen besteht aus mehreren Konfigurationsvariablen,
die Sie auf Ihre Situation anpassen können, aber nicht immer müssen –
meist sind die voreingestellten Werte ausreichend.
Wier
php.ini üblich, werden alle Einstellungen mit dem Schema
»name = wert« gesetzt. Der Name der Direktive setzt sich bei Suhosin
wie folgt zusammen:
suhosin.bereich.[optionaler unterbereich].direktive = wert
Nicht jeder Bereich hat einen Unterbereich – oftmals kommt auch
direkt nach dem Bereich der Name der Konfigurationsdirektive. Ein
Beispiel wäre
suhosin.cookie.max_array_depth = 100
11.5.1 Generelle Optionen
Alle Optionen, die mit dem Schutz der Ausführung von PHP-Skripten
zusammenhängen, werden mit dem Bereichsnamen »executor« mar-
kiert. Mit der Direktive
suhosin.executor.max_depth können Sie die
maximale Rekursionstiefe festlegen und Schutzverletzungen über sich
selbst aufrufende Funktionen verhindern. Ein klassisches Beispiel für
eine solche rekursive Endlosschleife, die bei ungebremster Ausführung
sehr schnell für einen Segmentation Fault sorgt, ist der folgende Einzei-
ler, der mit den üblichen sprachabhängigen Abwandlungen in prak-
tisch jeder Programmier- oder Skriptsprache funktioniert:
function f() { f(); } f();
5. http://www.suhosin.org/
26111.5 Konfiguration
Speichern Sie dieses Codefragment in einer PHP-Datei und lassen den
Interpreter diese Datei ausführen, dann bricht das Betriebssystem
sowohl bei mod_php als auch per CGI oder Kommandozeile innerhalb
kürzester Zeit die Ausführung mit einem Speicherzugriffsfehler ab. Um
das Skript auf eine geregelte Art und Weise abbrechen zu können und
nicht auf das OS vertrauen zu müssen, sollten Sie die in der
Standardinstallation deaktivierte Option aktivieren und mit einer
maximalen Rekursionstiefe von beispielsweise 300 versehen. Leider
lässt sich nicht eindeutig bestimmen, wo der maximale Wert für diese
Konfigurationseinstellung liegt – wann eine Endlos-Rekursion zu einem
Speicherzugriffsfehler führt, ist von System zu System verschieden.
suhosin.executor.max_depth = 300
Die Option suhosin.executor.func.whitelist dient dazu, eine Positiv-
liste von Funktionen zu definieren, die aufgerufen werden können –
und keine anderen. In der Praxis dürfte die Anwendung dieser Direk-
tive ziemlich selten sein, da es unsinnig erscheint, für eine Applikation
wie Typo3 zunächst eine Positivliste aller dort verwendeten PHP-
Funktionen zu definieren, um alle anderen dann zu verbieten. Theore-
tisch ergeben sich jedoch interessante Anwendungsmöglichkeiten: So
könnte ein Hosting-Provider seinen Kunden je nach Hosting-Paket
stark featurebeschränkte PHP-Fähigkeiten zur Verfügung stellen, ohne
neue PHP-Binaries oder -Module kompilieren zu müssen. Auch spezi-
alisierte virtuelle Hosts, auf denen ausschließlich eine bestimmte Auf-
gabe ausgeführt wird, sind denkbar.
Eine kommaseparierte Liste von Funktionsnamen wird an die
Direktive übergeben – Konstrukte wie
for, echo, aber auch include und
eval sind stets verfügbar und müssen nicht in die Whitelist übernom-
men werden.
Um die Whitelist zu deaktivieren, lassen Sie die Konfigurations-
direktive einfach leer – dann wird bei jedem Funktionsaufruf nur die
Blacklist beachtet.
Ein beispielhafter Aufruf, der ausschließlich den Aufruf der
wichtigsten MySQL-Funktionen erlaubt, sieht so aus:
suhosin.executor.func.whitelist =
mysql_connect,mysql_query,mysql_fetch_rows,mysql_num_rows,
mysql_close
Wird eine Funktion aufgerufen, die nicht in der Whitelist steht, bricht
das Skript ab und erstellt einen Log-Eintrag nach den Vorgaben, die in
der Logfile-Konfiguration gemacht wurden.
Möchten Sie lieber den herkömmlicheren (allerdings prinzipbe-
dingt nicht sichereren) Weg gehen, können Sie mit der Direktive

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