Der * * * Campingplatz
FAQ - Häufige Fragen und Antworten
Bereich: FAQ-Index -> Alles zum save_mode

Der PHP safe mode

Hintergründe zum PHP Safe-Mode. Infos zur Fehlermeldung "SAFE MODE Restriction in effect". Vorschläge zur Lösung des Problems.

Der Safe-Mode ist eine bestimmte Konfiguration für PHP. Bei nahezu allen großen Providern ist dieser Safe-Mode aus gutem Grund nicht aktiviert. Einige meist kleinere Provider haben den Safe-Mode jedoch aktiviert, wodurch es zu erheblichen Problemen kommen kann. Der Betrieb von webEdition auf einem System mit aktiviertem Safe-Mode kann unter bestimmten Umständen eingeschränkt bis unmöglich sein. Dieser Artikel beschreibt die Hintergründe. Bitte lesen Sie zum besseren Verständnis auch den Artikel "UNIX-Dateirechte". Die aktuellen Einstellungen können Sie sich mit dem PHP Befehl phpinfo(); anzeigen lassen.

Aussichten

Der Safe-Mode wird in den PHP 5 Versionen noch verfügbar sein, mit Erscheinen von PHP 6 wird es den Safe-Mode nicht mehr geben.

Das bewirkt der Safe-Mode

Es gibt im wesentlichen zwei Dinge, die sich mit der Aktivierung des Safe-Modes ändern. Zum einen wird ein Teil der Funktionen von PHP gesperrt. Dazu gehören u.a. die Möglichkeit Systembefehle auszuführen, die PHP Konfiguration zu verändern und z.B. die maximale Ausführzeit für einzelne PHP scripte zu erhöhen. Dies nimmt Ihnen als Kunden zwar einige mächtige Möglichkeiten, kann aber im Interesse der Systemsicherheit durchaus sinnvoll sein. Die zweite Auswirkung des Safe-Mode bringt aber oft mehr Probleme mit sich: PHP scripte dürfen nur noch auf Dateien zugreifen, die dem gleichen Eigentümer gehören, wie der PHP script der darauf zugreifen will. Diese Regel kein Problem, wenn sich nur ein einziger Webserver auf dem physikalischen Rechner befindet. Teilen sich jedoch mehrere Kunden einen Server verhindet dies oft, dass PHP scripte überhaupt Dateien schreiben dürfen. Versucht ein PHP script eine Datei zu lesen, die nicht dem gleichen Eigentümer gehört, erhalten Sie die Fehlermeldung "Safe-Mode Restriction in effect, the script whose userid is..." gefolgt von den exakten Ids der Benutzer.

Safe-Mode und Shared-Hosting

Werden keine besonderen Server-Programme vom Provider eingesetzt werden PHP Scripte immer unter dem Benutzer ausgeführt unter dem der Webserver arbeitet. Oft hat dieser den Namen "nobody", "apache", "wwwrun" o.ä. Dabei ist es vollkommen unerheblich auf welchem Kundenaccount sich die Daten befinden. Der Benutzer mit dem die PHP scripte ausgeführt werden ist immer der gleiche.

In der Praxis werden die Scripte meist per FTP auf den Server übertragen. Der Dateieigentümer der scripte ist also der FTP Benutzer. Nun wird eine PHP Datei im Browser aufgerufen – auf dem Server also vom Benutzer "wwwrun" ausgeführt. Dieses Script legt eine neue Datei (z.B. eine Webseite) an. Da das Script vom "wwwrun" ausgeführt wurde, ist bei der neu angelegten Datei der "wwwrun" als Dateieigentümer eingetragen. Versucht das PHP script nun erneut (egal ob lesend oder schreibend) auf die gerade angelegte Datei zuzugreifen, merkt PHP, dass die beiden Dateien unterschiedliche Eigentümer haben (die eine gehört dem FTP-Benutzer, die andere dem Webserver). Da der Safe-Mode aber nur Zugriffe auf Dateien erlaubt, die dem gleichen Eigentümer gehören wird in diesem Fall der Zugriff auf die gerade erstellte Datei verboten.

Da auch Ordner grundsätzlich nichts anderes als Dateien sind, verhält es sich ähnlich. Wird durch einen PHP script ein Ordner erstellt gehört dieser dem Webserver. Der PHP script darf nun in diesem Ordner aber keine Dateien erstellen, da sich auch hier der Dateieigentümer unterscheidet.

Allgemein bedeutet dies: Werden auf einem Shared-Hosting System PHP scripte im PHP Safe-Mode vom Benutzer "Webserver" ausgeführt ist es ohne Änderungen durch den Serveradministrator nicht möglich mit PHP Scripten Dateien zu schreiben. Somit ist auch der Betrieb von webEdition und den meisten anderen Content-Management-Systemen nicht möglich.

Lösungsmöglichkeiten:

Wo ein Problem ist, gibt es meistens auch eine Lösung, in diesem Fall sogar mehrere, welche aber alle die Kooperation des Server-Administrators voraussetzen.

Eigentümer Document-Root ändern

Bei allen Dateien wird der Webserver als Dateieigentümer gesetzt. Jetzt wird die Bedingung des Safe-Modes erfüllt und die Grundfunktionen von webEdition werden funktionieren. scripte, die längere Laufzeiten erfordern können, wie z.B. die Backup- oder Import-/Exportfunktionen können jedoch aufgrund der anfangs genannten Einschränkungen (Laufzeit kann von den scripten nicht selber verlängert werden) nicht oder nur teilweise funktionieren. Ein weiterer Nachteil ist, dass diese Lösung nicht sehr sicher ist, da der Benutzer "Webserver" ja auch von den anderen Kunden verwendet wird. Ist der PHP Parameter "open_basedir" nicht gesetzt können andere Kunden uneingeschränkt auch auf fremde Daten zugreifen. Der Safe-Mode kann auch so konfiguriert werden, dass diese "gleicher Eigentümer" Bedingung auf "gleiche Gruppe" geändert wird, dann können alle beteiligten Benutzer in der gleichen Benutzergruppe untergebracht werden.

PHP unter dem jeweiligen FTP-Benutzer ausführen

Es gibt Programme, die es erlauben PHP scripte für jeden virtuellen Host unter einem eigenen Benutzernamen auszuführen. I.d.R. ist dies der gleiche Benutzer, der auf für den FTP Zugang verwendet wird. Auch bei dieser Lösung wird nur unter einem Benutzer gearbeitet, so dass die wichtigste Bedingung des Safe-Mode erfüllt wird. Die unter a) genannten Einschränkungen bei einigen Funktionen gelten natürlich auch in diesem Fall. Diese Lösung ist gegenüber der ersten Lösung vorzuziehen, da sie erheblich sicherer ist.

Safe-Mode auf Group-ID beschränken

Der Safe-Mode kann statt auf die ID des Benutzers auch auf die ID der Gruppe beschränkt werden. Dadurch ist es möglich die für FTP-Zugänge verwendeten Benutzer in die gleiche Gruppe zu legen, wie den Webserver. Da mit dieser Option nur die Gruppe vergleichen wird, sind somit Lese- und Schreibzugriffe möglich. Einschränkungen bezüglich Shell-Access etc.. bleiben unverändert bestehen.

Safe-Mode abschalten

Dies ist in aller Regel die sinnvollste Lösung, da der Safe-Mode schlicht und ergreifend nicht für Shared-Hosting gemacht wurde. Die mit Blick auf die Serversicherheit sinnvollen Funktionen lassen sich problemlos auch ohne Safe-Mode nutzen. So erlaubt es z.B. der PHP Parameter "disable_functions" beliebige Funktionen von PHP zu deaktivieren. Dies könnten z.B. alle Funktionen sein, die es erlauben Systembefehle auszuführen. Der Zugriff auf Daten anderer Kunden wird durch den Safe-Mode i.d.R. so oder so nicht verhindert. Um dies zu vermeiden gibt es den PHP Parameter "open_basedir", der es erlaubt die Zugriffe auf ein bestimmtes Verzeichnis zu beschränken.

Tip für Administratoren

Die sicherste Möglichkeit besteht darin, PHP und andere Scipte grundsätzlich unter dem jeweiligen (FTP-)Benutzer ausführen zu lassen. Dies bringt jedoch den Nachteil mit sich, dass PHP nicht mehr als Modul ausgeführt werden kann sondern als CGI bei jedem Seitenaufruf neu gestartet werden muss. Die Folge sind Performanceverluste bzw. eine erhöhte Serverbelastung. Daher bietet es sich an, statt dem Safe-Mode die Parameter "open_basedir" und "disable_functions" zu nutzen. Bitte beachten Sie, dass der Safe-Mode vor allem Ihre Systemdateien schützt, i.d.R aber nicht den Zugriff auf Daten anderer Kunden. Der aktivierte Safe-Mode zwingt Ihre Kunden vielmehr den Dateieigentümer auf den Benutzer des Webservers zu setzen (setzen zu lassen) und somit die Sicherheit ihrer Kundendaten zu minimieren.
Alternativ kann die Prüfung der Dateirechte auch auf die Benutzer-Gruppe statt auf den einzelnen Datei-Eigentümer gesetzt werden.

Bei anderen CMS geht's doch...

Der Safe-Mode ist so lange kein Problem, wie mit PHP keine Dateien geschrieben werden. Viele CMS arbeiten ohne Dateien und entscheiden allein über Übergabewerte welches Dokument angezeigt werden soll. Dies ist zum einen nicht gerade Suchmaschinen freundlich und bietet zum anderen nicht die Möglichkeit Dokumente als statische HTML-Dateien zu speichern. Daher erstellt webEdition auch tatsächlich physikalische Dateien. Da das Schreiben von Dateien eher als Grundfunktion von Programmen gilt, sehen wir darin auch kein Problem. Daher gibt es auch keine Funktion um das Schreiben von Dateien abzuschalten o.ä. Nochmal: Die Rede ist natürlich immer nur von Schreibvorgängen innerhalb des eigenen Document-Roots (dort wo die HTML/PHP Dateien liegen)!.

| Geniality Dienstleistungen e.K. | Eichenstrasse 12 | 34466 Wolfhagen | Telefon: 05692 338 130-0 | Fax: 05692 338 130-1 |