Erstmal ist es meistens natürlich sicherer, PHP als CGI Version zu benutzen anstatt via mod_php direkt in den (Apache) Webserver einzubinden. -> Eigene (sichere) chroot- und setuid-Umgebungen für Skripte, anstatt alles im Webserver User.
Allerdings ergeben sich dadurch auch sicherheitsrelevante Nachteile, die bei der Entwicklung von PHP berücksichtigt wurden, jedoch ggf. durch richtige Konfiguration abgefangen werden müssen
1. PHP interpretiert keine Kommandozeilen-Argumente, die an das CGI Interface gegeben werden
2. –enable-force-cgi-redirect:
Hintergrund: Der User ruft /geheim/doc.php auf. Der Webserver überprüft die Zugriffsrechte und leitet dann den Aufruf gen /cgi-bin/php/geheim/doc.php weiter. Im Umkehrschluss heißt das, der User könnte die Datei über /cgi-bin/php/geheim/doc.php aufrufen (da es die CGI Verson darf), obwohl er auf die Datei eigentlich keinen Zugriff haben dürfte.
Um das zu vermeiden gibt es den ini Parameter cgi.force_redirect. Dieser ist standardmäßig auf on.
Der Parameter bewirkt, dass PHP nur dann parst, wenn der Aufruf durch einen korrekten Redirect des Webservers erfolgt ist. Das bedeutet aber auch, dass der Webserver eine Möglichkeit unterstützen muss, zu übermitteln, ob es sich hierbei um einen direkten Aufruf oder einen Redirect handelt. Vorsicht ist hier soweit mir bekannt bei IIS geboten, da dies dort der Fall ist. Ansonsten fällt mir aber spontan kein valider Grund ein, den Parameter auf off zu setzen. 😉
3. doc_root und user_dir
Stellen wir uns folgendes Szenario vor: Aufgrund eindes Konfigurationsfehlers im Webserver, gibt dieser die Scripte direkt aus, anstatt sie zum Interpreter zu geben. Der User hätte nun Einsicht auf das Script und damit ggf. auch auf Datenbank-Zugangsdaten etc..
Darauf basiert nun der Ansatz des Ini Settings doc_root. Dann sind im dort definierten Verzeichnis die PHP Scripte abzulegen. Allerdings ist das im PHP Bereich relativ wenig verbreitet, kann aber notwendig sein, wenn der Webserver force_redirect nicht unterstützt (s.o.). Alternativ Wechsel des Webservers eruieren. 😉
Mit user_dir kann die zu öffnende Datei noch für ein Verzeichnis /~user/datei.php unterhalb des doc_root definiert wrden.
4. –enable-discard-path / cgi.discard_path
Die o.g. Probleme können umgangen werden, kann das PHP CGI Binary auch einfach außerhalb der Webverzeichnisse z.B. /usr/local/bin/php abgelegt werden. Zustäzlich ist cgi.discard_path ist auf 1 zu setzen.
Kommentare sind geschlossen, aber Trackbacks und Pingbacks sind möglich.