PHP Sicherheit - Grundlagen
Bevor es in weiteren Beiträgen um spezielle Sicherheitstechniken geht, sollen hier noch einmal kurz die Grundlagen für sichere PHP-Programmierung aufgezeigt werden.
- Nicht auf register_globals verlassen
Auch wenn register_globals das Leben einfach machen könnte - die sich möglicherweise ergebenden Risiken sollten jeden Entwickler dazu bewegen, ausschließlich mit register_globals=off zu arbeiten - insbesondere da die PHP-Group auf die Globalisierung in späteren Versionen komplett verzichten wird. Siehe auch Umgang mit register_globals. - Alle Variablen vor ihrer Verwendung initialisieren
In register_globals Umgebungen können nicht initialisierte Variablen unter Umständen über GET/POST/COOKIE-Werte überschrieben werden, der Klassiker dazu ist
Falls $authorized nicht im Vorfeld auf FALSE gesetzt wurde, kann ein Benutzer den Wert einfach durch $_GET['authorized'], $_POST['authorized'], oder $_COOKIE['authorized'] setzen. - Jegliche Benutzerdaten validieren und ggfs. typisieren
Wie bereits im PHP Security Guide beschrieben (Datenfilterung) ist die Validierung von Benutzerdaten von elementarer Bedeutung. - Vorsicht bei der Verwendung von Variablen innerhalb von include-Anweisungen
Falls Anweisungen wie verwendet werden, sollte unbedingt sichergestellt sein, dass die Parameter nicht über GET/POST/COOKIE gesetzt werden können oder aber zumindestens nur erwünschte Werte enthalten können - ansonsten ergibt sich unter Umständen die Gefahr einer Remote Code Execution. - Nach Möglichkeit keine System-Kommandos benutzen
Systembefehle wie eval(), exec(), system(), passthru(), popen()und auch Backticks (``) sollten nur mit äußerster Vorsicht benutzt werden - da sie auf dem Server selbst abgearbeitet werden sind sie allerdings auch nahezu nie wirklich notwendig. Falls Systembefehle verwendet und dafür auch Parameter übergeben werden, müssen diese Werte mit größtmöglicher Sorgfalt validiert werden, ggfs. die escapeshellarg() und escapeshellcmd() Funktionen als zusätzliche Sicherheitsmaßnahme nutzen. Siehe auch PHP-Konfiguration. - Session Verzeichnis individualisieren
Falls Sessions verwendet werden, sollte zumindestens das Session-Verzeichnis individuell gesetzt werden - besser noch, über einen eigenen Sessionhandler die Werte in die Datenbank schreiben. - Bei Datei-Uploads den Namen individualisieren
Falls Dateien auf den Server geladen werden sollen, sollten diese umbenamt werden, am besten auf nicht vorhersagbare Namen. - HTML (und vor allen Dingen JavaScript) aus Benutzereingaben filtern, wenn diese auf der Seite angezeigt werden.
Um das Risiko von Cross-Site-Scripting zu minimieren sollte über strip_tags() oder ähnliche Funktionen sollte HTML und JavaScript aus allen Benutzereingaben gefiltert werden, bevor diese auf der Webseite angezeigt werden. - PHP-Meldungen nicht auf Liveseiten anzeigen
Um das Risiko von 'Information Disclosures' zu vermeiden sollten PHP-Meldungen grundsätzlich nicht auf Liveseiten angezeigt werden - besser alle Meldung in eine Datei schreiben lassen und lokal auswerten. - SQL-Injektionen vorbeugen
Wenn Variablen in SQL-Statements verwendet werden unbedingt entsprechende escaping-Funktionen nutzen, z.B. mysqli_real_escape_data() um sicherzustellen, dass nur die erwarteten Werte in die DB geschrieben werden. - Unter E_ALL-Bedingungen programmieren PHP-Fehler und Notices zeigen oftmals potentielle Schwachstellen im Code (z.B. nicht initalisierte Variablen) und stellen von daher ein sehr gutes Hilfsmittel währen der Entwicklung dar.
- Serverinformationen wie phpinfo() Skripte nicht öffentlich bereithalten
Um 'Information Disclosures' vorzubeugen sollte so wenig wie möglich über die Serverumgebung bekannt gegeben werden - insbesondere öffentlich phpinfo() Skripte sollten vermieden werden.