Um einen Server sicher zu betreiben, muss zunächst die Betriebssystemsicherheit hergestellt sein. Nicht nur die eigenen geschriebenen PHP-Programme können Sicherheitslücken aufweisen, sondern auch das Betriebssystem selbst, in welches dann Angreifer einsteigen und somit auch sämtliche Funktionalität des PHP-Programmes aushebeln können. Um ein System sicher zu gestalten, ist es das A und O, die aktuellsten Softwareupdates einzuspielen. Wird eine Linux- oder Windows-Version betrieben, für die es keine Sicherheitspatches mehr gibt, so muss dieses System unmittelbar auf ein neues System inklusive der nötigen Softwareänderungen umgezogen werden. Dies gilt besonders auch für verwendete PHP-Version. Für alte PHP-Versionen existieren keine Sicherheitsupdates mehr und Lücken werden offen gelassen. Leider ist es so, dass von Zeit zu Zeit Funktionen in ihrer Signatur geändert werden oder auch ganz aus PHP entfernt werden. Hier ist das eigene PHP-Programm manuell anzupassen.
PHP lässt sich in zwei unterschiedlichen Modi betreiben, einmal im CGI-Modus und einmal als Apache-Modul-Modus.
Im CGI-Modus sollte der Parameter cgi.force_redirect
in der php.ini
aktiviert sein. Auf diese Weise kann PHP nicht direkt im cgi-bin
-Verzeichnis aufgerufen werden, sondern der Webserver muss selbst eine Weiterleitung dorthin organisieren. Wird PHP direkt im cgi-bin
-Verzeichnis aufgerufen, so ist es über Dateisystemnavigationsfunktionalität möglich, eine beliebige Datei des Systems als Eingabedatei zu verwenden, beispielsweise auch die Linux-Passwortdatei. Mit dem Redirect wird dies verhindert.
Wenn ein Webserver fehlerhaft konfiguriert ist, so kann es sein, dass er statt PHP-Dateien auszuführen und das Ergebnis an den Client zu schicken, PHP-Dateien direkt in ihrem Sourcecode an den Client schickt. Damit werden sicherheitskritische Interna das PHP-Skriptes verschickt, wie beispielsweise Passwörter, die hier enthalten sein könnten. Zusätzlich geht geistiges Eigentum verloren. Werden HTML-Verzeichnis und PHP-Verzeichnis in verschiedenen Unterbäumen des Verzeichnisbaumes abgelegt, so entsteht auch bei einer Fehlkonfiguration des Servers dieses Problem nicht. Mit Hilfe der php.ini
-Variable doc_root
lässt sich das Wurzel-PHP-Verzeichnis, welches im CGI-Modus genutzt wird, verschieben.
Für einen ähnlichen Zweck kann die Variable user_dir
genutzt werden. Besonders der Apache-Webserver ermöglicht es, unterschiedlichen Nutzern eines Servers ein eigenes Verzeichnis, welches meist unter public_html
in ihrem Heimatverzeichnis liegt, unter http://mein-server/~benutzername/
als Webseite zu nutzen. Mit der Belegung der Variablen user_dir
kann nun auch ein eigenes Verzeichnis beispielsweise mit dem Namen public_php
angelegt werden. Nur PHP-Skripte in diesem Verzeichnis werden ausgeführt und es sich sichergestellt, dass das Verzeichnis nicht versehentlich durch eine Webserverfehlkonfiguration veröffentlicht wird.
Weiterhin ist es möglich PHP als Apache-Modul zu verwenden. Der Webserver selbst sollte nicht unter dem Root-User betrieben werden, sondern sollte eingeschränkt werden. Wenn ein Angreifer es schafft, in den Webserver einzudringen, so hat er direkt Vollzugriff auf das System. Läuft aber der Server und damit auch das PHP-Skript unter einem eingeschränkten Benutzer, so bietet das Betriebssystem einen weiteren Schutz. Eine Erweiterung hiervon ist es die Apache Autorisierung zu nutzen.
Mit Hilfe der php.ini
-Variablen open_basedir
ist es möglich, das Verzeichnis einzuschränken, in welchem generell PHP-Skripte Zugriff haben. Zur Laufzeit kann dieses Verzeichnis mit ini_set()
noch weiter eingeschränkt werden.