PHP safe_mode und open_basedir
Frage:
Ständig stolpern PHP Projekte über die Einstellungen safe_mode und open_basedir. Wozu sind die eigentlich in PHP gut bzw. was bewirken die?
Antwort:
open_basedir
Das open_basedir sorgt dafür, dass eine Webseite nur auf das eingestellte Verzeichnis open_basedir und dessen Unterverzeichnisse zugreifen kann. Bei Shared-Webhosting ist die Einstellung daher extrem wichtig und wird bei ECS-Webhosting keinesfalls abgeschaltet! Wichtig zu wissen ist, dass PHP auf Groß- und Kleinschreibung achtet. Ob bei Windows die Pfade mit \ oder \\ oder / geschrieben werden, sollte eigentlich kein Rolle spielen.
Sollten Sie daher bei der Ausführung Ihrer Scripten eine open_basedir Fehlermeldung bekommen, dann überprüfen Sie die Pfadangaben sowie Groß- und Kleinschreibung für Ihre include-Dateien. Wir empfehlen unter Windows, die Pfade mit / zu schreiben.
Beispiel:
open_basedir=D:/web
Zugriff ist erlaubt auf D:/web, D:/web/domain, D:/web/domain/temp, ...
Zugriff ist verboten auf D:/, C:/Windows, ...
Besonderheiten:
Seit PHP 4.1.8 muss man unter Linux explizit das Upload-Verzeichnis zusätzlich in den open_basedir aufnehmen, auch wenn man meinen könnte, PHP könnte das mit den Angaben upload_tmp_dir und session.save_path vielleicht selber hinbekommen. Mehrere Verzeichnisse trennt man unter Windows mit ; und unter Linux mit |
Linux Beispiel:
open_basedir=/var/www/vhosts/DOMAIN/httpdocs|/tmp
Möchte man unabhängig von der php.ini einen Wert für das open_basedir einstellen, so muss man unter Windows in der Registry einen Wert hinzufügen:
Beispiel:
Das Kundenverzeichnis liegt unter:
D:\web\KUNDE\DOMAIN\htdocs
Registry:
Schlüssel anlegen:
HKEY_LOCAL_MACHINE\SOFTWARE\PHP\Per Directory Values\D\web\KUNDE\DOMAIN\htdocs
String hinzufügen:
Name: open_basedir
Type: REG_SZ
Data: spezielles-open_basedir-Verzeichnis
safe_mode
Der safe_mode hat 2 Funktionen: Zum einen verweigert er die Ausführung von Shell-Kommandos (execute(), ...), zum anderen verweigert er den Zugriff auf Dateien, die dem aktuellen Benutzer der Webseite nicht gehören.
Linux:
Standardmäßig läuft Apache als wwwrun, während der FTP-Zugang und PHP z.B. als Benutzer ftpbenutzer laufen. Lädt man jetzt mit PHP Dateien hoch oder holt sich diese mit curl, so gehören diese wwwrun. Somit kann PHP (ftpbenutzer) nicht auf seine Dateien mit Benutzer wwwrun zugreifen. Hier hilft nur safe_mode abschalten oder die Dateien per FTP hochladen. Mit einem Shellzugriff könnte man ebenfalls mit z.B. chown -R ftpbenutzer:psacln die Benutzerrechte korrigieren... was aber recht umständlich ist.
Unsere Meinung:
Mit einer ordentlich eingestellten Angabe open_basedir sollte der safe_mode eigentlich nicht mehr nötig sein. Ein Restrisiko bleibt wegen der Möglichkeit der Shell-Kommandos. Normal benötigen PHP Projekte keinen Shell-Zugriff (abgesehen von Typo3 mit ImageMagick :-( ), aber Hacker könnten nach wie vor ein schlecht programmiertes PHP-Script ausnutzen, um eigene PHP-Seiten hochzuladen, welche natürlich bösartigen Code enthalten können.
ECS-Webhosting schaltet daher den safe_mode nur im äußersten Notfall aus. Bei bekannten OpenSource Projekten wie Joomla wird der safe_mode garantiert nicht abgeschaltet! Joomla hat mit seinen 1001 Sicherheitslücken zuviel Potenzial für Hackangriffe. Eine Ausnahme machen wir bei Typo3. Ohne safe_mode=off läuft ImageMagick nicht und Extensions über die Weboberfläche machen nur Probleme. "Wir können bei Linux nicht auf die Typo3 Kundschaft, welche den Großteil stellt, verzichten."
Windows:
Unter Windows läuft PHP und der Webserver unter demselben Benutzer, insofern stellt sich die Problematik mit Dateien erst gar nicht. Wir haben die Erfahrung gemacht, dass die Shell-Kommandos unter Windows nicht (richtig) funktionieren. Insofern spielt es unter Windows eigentlich keinerlei Rolle, ob der safe_mode ein- oder ausgeschaltet ist. Standardmäßig ist der safe_mode aber auch hier eingeschaltet.
Deinen Kommentar hinzufügen