Hallo
Folgendes Problem:
Auf einem Linux-Server läuft php als Apache-Modul. Mehrere Benutzer haben dort Webspace. Jeder dieser Benutzer hat FTP-Zugriff auf das Verzeichnis /www/htdocs/Nutzername und für jeden Nutzer gibt es auch ein Linux-Benutzer-Konto, mit dem man nur auf sein eigenes Verzeichnis zugreifen kann. PHP aber läuft als Benutzer php, der auf alle Verzeichnise Zugriff hat. Mit den PHP-eigenen Funktionen für Dateizugriff gibt es kein Problem, ein Zugriff auf fremde Nutzerverzeichnisse ist durch entsprechende Einstellungen gesperrt. Allerdings kann man mit exec() fremde Verzeichnisse auslesen, da der per exec() ausgeführte Befehl ja unter gleichem Nutzer läuft wie der PHP-Prozess.
Als Lösung kämen in Betracht:
-PHP als CGI mit modsu, dabei läuft der PHP-Prozess unter dem Benutzer, zu dem die php-Datei gehört. => zu langsam
-PHP als FastCGI mit modsu, dabei müsste aber für jeden Nutzer dauerhaft ein FastCGI-PHP-Prozess laufen. => braucht viel Rechenleistung
-exec() und ähnliche Befehle deaktivieren. => Scripte, die exec() verwenden, laufen nicht mehr. Das gilt vor allem für Bildergalerien, die ImageMagick per exec() werwenden.
Es wurde auch schon über Safemode nachgedacht, bei dem nur Programme aus dem angegebenen exec-Dir ausgeführt werden können. Allerdings reichen schon cd und echo zusammen mit dem Kürzel * für ‚alle Dateien im Verzeichnis‘ zur Nutzung der Sicherheitslücke. Diese Befehle sind aber keine Programme sondern werden von der Shell ausgewertet. Sie sind also auch ohne zugehörige ausführbare Datei im exec-Dir verfügbar.
Nebenbemerkung: Wieso kann man in exec() oder system() Shellbefehle verwenden? Mit exec und system sollen doch nur echte Programme aufgerufen werden. Für Shellbefehle gibt es ja extra shell_exec().
Die ideale Lösung wäre, wenn PHP die Befehle unter anderen Nutzerrechten ausführen könnte. Technisch wäre das kein Problem, aber ich habe nirgends eine Einstellung dazu gefunden.
Was kann man also tun?
Gruß Johannes