Die php.ini ist die zentrale Konfigurationsdatei von PHP. In ihr werden viele wichtige und weniger wichtige Einstellungen vorgenommen, die das Verhalten von PHP auf dem Server, und somit auch unsere Scripts, beeinflussen. In diesem Artikel interessieren uns nur die Einstellungen, die direkt mit der Sicherheit von PHP zu tun haben. Einige der Einstellungen erfordern eine grössere Sorgfalt beim Programmieren, aber der etwas höhere Aufwand lohnt sich in jedem Fall. Der Sitebetreiber haftet, wenn durch Lücken die bei der Programmierung offen gelassen wurden dubiose Gestalten über unseren Server Schadsoftware verteilen oder Massenmails versenden.
Schauen wir uns nun einmal die wichtigsten Sicherheitseinstellungen an:
- allow_url_fopen – Diese Einstellung legt fest, ob man Dateien öffnen kann (z.B. mit fopen()) die nicht auf unserem Server liegen. Verbietet man dies, wird es einem Angreifer natürlich erschwert seinen Schadcode aus dem Internet nachzuladen. Manchmal benötigt man dies allerdings, etwa um Feeds von externen Servern zu laden. Viele CMS- und Blog-Systeme bieten Module/Komponenten/Plugins an, die auf so einen Remotezugriff basiert. Dennoch, kein Feed kann so wichtig sein, dass man die Serversicherheit und/oder die Sicherheit unserer Sitebesucher gefähren muß. Empfohlene Einstellung: OFF
- allow_url_include – Ähnlich wie allow_url_fopen, allerdings betrifft diese Einstellung nicht das öffnen von Dateien, sondern das inkludieren (include(), require()) von Dateien. Empfohlene Einstellung: OFF (erst ab PHP 5.2.0 verfügbar!)
- disable_functions – Hier kann man eine, durch Komma separierte, Liste mit PHP-Funktionen eintragen deren Benutzung gesperrt sein soll. Wenn man sie nicht unbedingt benötigt, sollten hier alle Funktionen eingetragen werden, die einen serverweiten Zugriff gestatten. Manche Funktionen, wie etwa exec(), sind vergleichbar mit einem Generalschlüssel für den Server. Empfohlene Einstellung: escapeshellcmd, exec, ini_restore, passthru, popen, proc_nice, proc_open, shell_exec, system
- display_errors – Während der Entwicklung einer Seite ist es zum debuggen unerlässlich sich PHP-Fehler auf der Seite anzeigen zu lassen. Im produktiven Einsatz sollte dies allerdings vermieden werden. Fehlermeldungen sind nicht nur lästig und hinterlassen einen unprofessionellen Eindruck beim Sitebesucher sondern, und das ist viel wichtiger, geben Fehlermeldungen jedem Angreifer wichtige Informationen über die Struktur und den Aufbau unserer Scripts.Es erleichtert dem Angreifer Schwachstellen in unserer Anwendung zu entdecken um diese auszunutzen.Empfohlene Einstellung: OFF
- open_basedir – Legt den Wirkungsbereich fest, in dem wir mit PHP arbeiten können. Auf diese Art kann man verhindern, dass ein manipuliertes Script Zugriff auf gewisse Ordner oder ganze Bereiche auf unserem Server erhält.Empfohlene Einstellung: Root Verzeichnis der Internetpräsenz (muss individuell, passend zum Server eingestellt werden. In der Regel ist das etwa /pfad/zum/webroot/htdocs)
- register_globals – Die Wurzel allen Übels, für die allermeisten Sicherheitslöcher in Webanwendungen! Ist diese Einstellung aktiv, werden Variablen aus GET und POST global verfügbar gemacht und überschreiben damit ggfs. andere Variablen mit dem selben Name. Ist diese Einstellung deaktiviert, muss auf Eingaben von aussen explizit mit $_GET und $_POST zugegriffen werden.Empfohlene Einstellung: OFF
- safe_mode – Ist der Safe_Mode aktiviert, werden u.a. Berechtigungs-Prüfungen durchgeführt, ob die gewünschte Aktion von einem User durchführbar ist. Beispiel: Wenn wir eine Datei via FTP auf unseren Server übertragen, bekommt diese Datei ein Vermerk das der FTP-Benutzer XYZ der Besitzer dieser Datei ist. Möchten wir nun diese Datei mit PHP verändern, wird erst geprüft ob dieser Zugriff vom Benutzer XYZ kommt oder nicht. Das kann bei PHP nicht der Fall sein, also wird der Zugriff auf die Datei verhindert. Umgekehrt funktioniert das genauso. Dateien die per PHP auf den Server übertragen wurden, können nicht so ohne weiteres via FTP gelöscht oder verändert werden. (Vorausgesetzt die CHMOD Rechte wurden nicht entsprechend gesetzt). Dieses Thema ist recht komplex und wird sehr gut in der PHP Dokumentation erklärt. Empfohlene Einstellung: ON
- Jetzt haben wir einen kleinen Überblick, welche Einstellungen wir vorzunehmen hätten um unser PHP sicher(er) zu konfigurieren. Leider wird das bei den meisten nicht so einfach möglich sein, denn für gewöhnlich, besonders bei Miet-Webspace, erlaubt der Provider nicht das man an der PHP.ini herumspielen darf. Einige Provider erlauben dies allerdings, für andere gibt es oft alternative Wege um gewisse Einstellungen zu ändern. Der einfachste Weg ist erst mal nachzuschauen ob überhaupt etwas an der Konfiguration geändert werden muß. Dies macht man am besten mit einem Blick in die PHPInfo. Besteht Handlungsbedarf, sollte man zuerst mal seinen Provider kontaktieren und höflich anfragen, ob er diese Einstellungen anpassen kann.
Alternative Wege Einstellungen zu ändern
Manche Einstellungen -das betrifft jetzt nicht nur die oben erwähnten PHP.ini Einstellungen- kann man aber auch auf anderem Weg anpassen. So kann man etwa auch die Ausgabe der PHP-Fehler unterdrücken, indem man in seinen Scripts die Zeile
error_reporting( 0 );
im Script-head platziert.
Auch mittels der .htaccess Datei kann man Einstellungen ändern, sofern der Provider dies erlaubt. Manchmal ist dieser Weg sogar der bessere, weil eine .htaccess nur im aktuellen Ordner und dessen Unterordner wirkt und nicht global, so wie es die php.ini macht. Um z.B. die register_globals nur für einen Ordner zu deaktivieren, legt man eine .htaccess an und schreibt als Inhalt hinein:
php_flag register_globals off
Die .htaccess kennt 2 Wege um PHP Einstellungen zu ändern. Zum einen gibt es Flags, wie im letzten Beispiel gesehen, zum anderen gibt es Values. Ein Flag wird benutzt, wenn eine php.ini Einstellung nur Ja oder Nein (1/0 oder on/off) haben kann. Ein Value (auf deutsch: Wert) wird benutzt, um eine Einstellung mit einem bestimmten Wert zu ändern,
Beispiel:
php_value upload_max_filesize 24M
Hier würde das upload_max_filesize, also die Größe einer Datei die per PHP hochgeladen werden kann, auf 24 MB gesetzt. Würde man hier statt php_value nun php_flag benutzen, käme es aller Wahrscheinlichkeit nach zu einem 500 Internal Server Error.
Dieser Internal Server Error trifft für gewöhnlich auch auf, wenn man versucht eine PHP-Einstellung zu ändern und keine Berechtigung hat.
Wichtiger Lesestoff zum Thema Sicherheit
Das bereits gezeigte war nur eine kleine Einführung in die Materie. Wesentlich detailliertere und ausführlichere Informationen zu diesem Thema findet man hier: