Skript-Sicherheit mittels PHP.INI erhöhen
Veröffentlicht am 07.11.2012 von Dietmar Leher
Nachem wir uns vor wenigen Wochen hier im Blog dem "Mysterium der PHP.INI" gewidmet hatten, möchten wir nachfolgend auf einige der möglichen Einstellungen eingehen, die zum Schutz Ihrer Webpräsenz beitragen (können).
Für die php.ini-Datei Ihrer Domain(s) sind beispielsweise folgende Optionen und Werte je nach Anwendungszweck sinnvoll:
allow_url_fopen = "Off" | Deaktiviert die Möglichkeit Dateien einer anderen Domain zu öffnen |
allow_url_include = "Off" | Deaktiviert die Möglichkeit Dateien einzubinden |
expose_php = "Off" | Gibt kein PHP-Logo und kein HTTP Header X-Powered-By aus |
display_errors = "Off" | Zeigt keine Fehlermeldungen auf der Webseite an |
register_globals = "Off" | Deaktiviert die globale Verfügbarkeit von GET und POST |
safe_mode = "On" | Aktiviert u.a. Prüfungen von Dateiberechtigungen (User identifier) |
safe_mode_gid = "On" | (Aktiviert u.a. Prüfungen von Gruppenberechtigungen (Group identifier)) |
Alle genannten Werte können auch über "0" für "Off" deaktiviert oder "1" für "On" aktiviert werden.
Bitte beachten Sie, dass manche Software die eine oder andere Option benötigt (z.B. allow_url_fopen [Joomla-Updatesuche]). Bitte schalten Sie diese in einem solchen Fall nicht ab.
Im Falle von Joomla kann ein Update beispielsweise auch mit geringfügigem Mehraufwand über das manuelle Laden der Dateien und Entpacken auf dem Webserver erfolgen.
Wurde die Anzeige von Fehlermeldungen (display_errors) deaktiviert, ist es im Regelfall sinnvoll, diese dann in eine Datei schreiben zu lassen. Dazu nutzen Sie in der php.ini-Datei die Option log_errors = ON und geben den Pfad zur Datei über error_log = /pfad/zum/log an.
Die Optionen zu den register_globals und safe_mode sind seit PHP 5.3.0 veraltet und finden keine Anwendung mehr, diese sind in den neuen Versionen von PHP größer 5.4.0 auch komplett entfallen.
Shell-Befehle deaktivieren
Ebenfalls kann es bei Bedarf Sinn machen, die Ausführung von Befehlen auf dem Webserver per Skript zu unterbinden, nachfolgend ein möglicher Eintrag für die php.ini-Datei:
disable_functions = "show_source, shell_exec, passthru, exec, phpinfo, system, popen, proc_open, ini_restore, proc_nice"
Diese Liste kann jederzeit auch erweitert werden und wer viel Wert auf Sicherheit legt, kann dort auch Dinge wie beispielsweise die Anzeige des noch zur Verfügung stehenden Speicherplatzes, der aktuellen User-ID u.ä. deaktivieren: escapeshellarg, escapeshellcmd, diskfreespace, disk_free_space, getmyuid, pfsockopen, link, set_time_limit
Sie finden eine Erklärung der jeweiligen Funktionen in der Referenz von PHP unter http://de3.php.net/manual/de/funcref.php
Dort existiert auch eine Suchfunktion.
Auch hier gilt: Es kann Anwendungen wie ein CMS, Blog, eine Bildergalerie o.ä. die eine der genannten Funktionen in Skripten einsetzt und zwingend erfordert. Die Deaktivierung von Optionen kann daher zu Fehlverhalten führen! Wir empfehlen, die Optionen nicht zu setzen, wenn Ihnen die Funktion unklar ist.
Sichere PHP-Version wählen
Aus diesem Grund werden bei uns nur drei der eingangs genannten Einstellungen standardmäßig gesetzt, wenn Sie für Ihre Domain im Kundenmenü die "sicheren PHP-Einstellungen" ausgewählt haben:
allow_url_fopen = "Off"
allow_url_include = "Off'"
register_globals = "Off"
Wir hoffen, Ihnen mit diesen Grundlagen einen kurzen Einblick in das komplexe Thema 'Sicherheit' gegeben zu haben. Eine allgemein gültige Empfehlung für eine PHP.INI, die alle Anwendungszwecke abdeckt, kann es nicht geben und die in diesem Artikel genannten Punkte sind sicher nur eine Auswahl der möglichen Optionen.
Haben Sie darüber hinaus noch Tipps und Anregungen zu Optionen der PHP.INI oder einen Erfahrungsbericht, so freuen wir uns über Kommentare.