PHP/Sicherheit

Aus Mikiwiki
< PHP
Version vom 13. Januar 2009, 11:32 Uhr von Michi (Diskussion | Beiträge) (New page: == Sicherheitsprobleme == Die Absicherung eines Webservers sollte immer mit grosser Aufmerksamkeit erfolgen. PHP ist eine sehr leistungsstarke Sprache, die viele Befehle und Funktionen en...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Sicherheitsprobleme

Die Absicherung eines Webservers sollte immer mit grosser Aufmerksamkeit erfolgen. PHP ist eine sehr leistungsstarke Sprache, die viele Befehle und Funktionen enthält, mit denen direkt auf das Betriebssystem eingewirkt werden kann. Schon ein einfacher Tippfehler kann deshalb für die Sicherheit des Webservers problematisch sein. PHP kann Dateien lesen, schreiben, verändern und löschen. Es wird als CGI-Programm oder als Modul im Apache HTTP-Server installiert. Auch aus dieser Position heraus kann mit PHP-Skripten Schaden angerichtet werden.

PHP selbst ist mit weitreichenden Freiheiten ausgestatett, jedoch keineswegs in dem Umfang wie C oder Perl. Die Sicherheitseinstellungen sind vielfältig veränderbar.

Angriffsszenarien

Angriffe auf Webserver sind häufig und treffen jeden - keine Seite ist unwichtig genug, um nicht zum Opfer werden zu können. Auch wenn keine wichtigen Daten vorhanden sind, kann ein Angriff zu Schäden führen und kostet zumindest die Zeit des Systemverwalters.

PHP als CGI-Programm

Die Installation als CGI-Programm ist der wichtigste Sicherheitsschritt. Dem steht die Leistung entgegen - CGI ist als universelle Schnittstelle ausgesprochen langsam.

Ein Problem stellen manipulierte Pfade dar. Normalerweise kann ein Nutzer aus dem Internet nicht auf Pfade des Webservers zugreifen, die nicht ausdrücklich unter "htdocs" freigegeben wurden. Ist PHP im "/cgi-bin"-Verzeichnis erreichbar, sind Pfadangaben wie die folgende erlaubt.

http://www.meinserver.xx/cgi-bin/php/docs/aktien.doc

Der an den Aufruf des Programms PHP angehängte Pfad (hier "/docs/aktien.doc") wird als Zugriff auf ein Dokument interpretiert. Das Dokument wir dgeholt und an den Webbrowser gesendet. Normalerweise kann der Webserver keine ZUgriffsrechte überprüfen. Im gezeigten Fall soll das Dokument vielleicht nur einer geschlossenen Benutzergruppe zugänglich gemacht werden. Dazu wird ein virtuelle Verzeichnis eingerichtet und der anonyme Webnutzer ("nobody" im Apache HTTP-Server) davon ausgeschlossen. Der Aufruf erfolgt dann wie folgt. Beim Abruf prüft der Webserver dann die Rechte und verlangt Name und Passwort oder lehnt die Übertragung sofort ab.

http://www.meinserver.xx/docs/aktien.doc

Wird der physische Pfad (wenn er denn bekannt ist) verwendet, so prüft der Webserver nur die Sicherheit der Pfadangabe vor "php". Normalerweise wird der Interpreter aber allen zugänglich sein und das Dokument deshalb übertragen.

http://www.meinserver.xx/cgi-bin/php/docs/aktien.doc

Mit den Schlüsselwörtern "doc_dir" und "user_dir" in der Konfigurationsdatei "php.ini" kann PHP Voreinstellungen der Stammpfade einrichten. Damit kann das Verhalten unterdrückt werden. Nur die hier angegebenen Pfade werden überhaupt akzeptiert.

PHP ausserhalb der Webserver-Umgebung

Die sicherste Methode ist die Plazierung der ausführbaren Dateien ausserhalb der Webserver-Umgebung, beispielsweise in "/usr/local/bin". In der Apache-Konfigurationsdatei "httpd.conf" können die Verknüpfungen an diesem Ort hergestellt werden. In der Unix-Umgebung muss dann allerdings jede Datei mit dem Shell-Befehl "#!" beginnen und den Pfad zu PHP enthalten. Ausserdem müssen die Dateien nicht nur Skriptrechte, sondern auch Ausführrechte besitzen.

#!/usr/local/bin/php

Verzeichnisschutz auf dem Webrechner mit .htaccess

Ob PHP als CGI-Programm oder als Apache-Modul läuft, wird oft nicht vom Entwickler entschieden. Man sollte sich deshalb bei der Programmierung auf alle Varianten enstprechend vorbereiten und nur solche Skripte schreiben, die in allen Umgebungen laufen.

Für den Apache HTTP Server gibt es eine Lösung mit Hilfe der Konfigurationsdatei .htaccess.