Nachfolgend erhalten Sie einen kurzen Überblick über die wichtigsten Sicherheitsoptionen von PHP:
allow_url_fopen (empfohlen: off) steuert, ob Dateizugriffe auch auf externe URLs verweisen dürfen oder nicht. Verbietet man dies, fällt es einem Angreifer schwerer, Schadprogramme aus dem Internet nachzuladen. Seit PHP 5.2.0 regelt allow_url_include das Verhalten separat für die Befehle include() und require().
display_errors (empfohlen: off) schaltet die Anzeige von PHP-Fehlermeldungen ein oder aus. Was fürs Debugging hilfreich ist, kann andererseits auch Angreifern Aufschluss über Anwendungsinterna geben, die für weitere Attacken hilfreich sind.
disable_functions spezifiziert eine Liste von gesperrten PHP-Funktionen. Insbesondere PHP-Anwendungen, die unter Sicherheitsapekten entwickelt wurden, machen einen großen Bogen um potenziell gefährliche Funktionen wie exec(), sodass ihr Fehlen ihnen häufig keine Probleme bereitet -- vielen im Umlauf befindlichen Exploits aber sehr wohl.
open_basedir (empfohlen: Web-Home) limitiert die Dateioperationen von PHP auf das angegebene Verzeichnis und darin enthaltene Unterverzeichnisse. Es ist möglich, mehrere Verzeichnisse mit einem Doppelpunkt getrennt anzugeben. Wichtig ist, Pfadangaben mit einem Slash zu beenden, da sie andernfalls auch alle Verzeichnisse einschließen, die mit dem angegebenen Namen beginnen.
register_globals (empfohlen: off) steuert, ob Skripte Parameter aus der URL oder den POST-Daten als globale Variablen übergeben bekommen oder nicht. Viele Schwachstellen in PHP-Anwendungen lassen sich nur ausnutzen, wenn dies der Fall ist.
safe_mode (empfohlen: on) gibt an, ob PHP in einem speziellen abgesicherten Modus laufen soll oder nicht. Er hat weitreichende Auswirkungen, beispielsweise findet bei Dateioperationen ein zusätzlicher UID-Check statt und der Zugriff auf Umgebungsvariablen ist eingeschränkt.
sql.safe_mode regelt eine Sonderbehandlung von Anmeldungen an Datenbankservern. In diesem Modus verwenden die PHP-Funktionen zur Datenbankanmeldung ausschließlich den Namen des System-Users, dem das Skript gehört. Da in Shared-Webhosting-Umgebungen der Name des Datenbanknutzers fast nie mit dem es System-Users übereinstimmt, kommt dort diese Option nur äußerst selten in Frage.
Eine besonders abgedichtete php.ini hat damit den folgenden Inhalt:
[PHP]
register_globals = off
allow_url_fopen = off
safe_mode = on
open_basedir =
disable_functions = exec,system,passthru,shell_exec,popen,escapeshellcmd,proc_open,proc_nice,ini_restore
display_errors = off
Die mit disable_functions gesperrten PHP-Funktionen in der oben genannten Empfehlung sind aber mit Vorsicht zu genießen. So funktionieren unter Confixx einige Funktionen nicht mehr, wenn hier keine Ausnahmeregelung vorgenomen wird.
Als serverseitige Sicherungsmaßnahmen empfehlen wir den Einsatz der PHP-Erweiterung Suhosin. Für Debian-Anwender gibt es unter www.dotdeb.org bereits fertige PHP4 und PHP5 Pakete mit Suhosin-Patch.
Eine gute Dokumentation des PHP-Safe-Mode findet man hier .