Zum Inhalt springen
Der Guide für ein smartes Leben.
So machen Sie PHP sicher...

Teil 3: PHP-Zertifizierung

Autoren: Redaktion pcmagazin und Tobias Hauser • 25.3.2009 • ca. 3:05 Min

Inhalt
  1. PHP-Zertifizierung
  2. Teil 2: PHP-Zertifizierung
  3. Teil 3: PHP-Zertifizierung

Dies ist die Urmutter jeder SQL-Injection. Mit einem Apostroph kann hier die Datenbank ausgehebelt werden. Wenn der Nutzer folgenden Code in die entsprechenden Formularfelder einträgt, erhält er freien Zugang:...

Dies ist die Urmutter jeder SQL-Injection. Mit einem Apostroph kann hier die Datenbank ausgehebelt werden. Wenn der Nutzer folgenden Code in die entsprechenden Formularfelder einträgt, erhält er freien Zugang:

' OR ''='

Glücklicherweise ist die Filterung gegen SQL Injections recht wirkungsvoll. PHP bietet für die verschiedenen Datenbanken eigene Filterfunktionen. Für MySQL ist das mysqli_real_escape_string(). Auch Prepared Statements können - wenn von der Datenbank unterstützt - helfen. Eine reine Filterung mit addslashes() reicht allerdings nicht aus, da nur die speziellen Filterfunk-tionen alle Tricks und verschiedene Zeichensätze berücksichtigen.

Sonstiges

Viele Angriffe aus dem XSS- und Cross-Site-Request-Forgeries-Bereich zielen darauf ab, die Session des Nutzers zu kapern. Man nennt dies auch Session-Hijacking. Bei Sessions - vor allem in der URL - ist es für den Angreifer auch möglich, selbst eine Session im System zu generieren und diese dann dem anderen Nutzer unterzuschieben, bevor er sich einloggt. Nach dem Log-in hat der Angreifer damit die Möglichkeit, über die fixierte Session selbst zuzugreifen. Dies nennt man auch Session Fixation.

Gegen Angriffe auf die Sitzungs-ID wehren Sie sich mit kurzen Timeout-Zeiten, die für den Nutzer allerdings aus Usability-Gründen nicht optimal sind. Beim Starten gefährlicher Operationen können Sie die Sitzungs-ID auch über session_regnerate_id() neu generieren. Gegen die Session Fixation hilft eventuell auch der Wechsel auf Cookies (in der php.ini session.use_only_cookies).

In den Bereich der Injections fällt neben der SQL- auch die Code-Injection. Sie kommt überall dort zum Einsatz, wo aus übergebenen Parametern direkt Dateiaufrufe gemacht werden. Dagegen hilft vor allem das Filtern gegen eine Liste mit erlaubten Dateien (Whitelisting). Auch der Einsatz der Kommandozeile ist hier ein potenzielles Angriffsziel. Hierfür gibt es Filterfunktionen (escapeshellargs() und escapeshellcmd()), allerdings ist dennoch Vorsicht geboten.

Beim Sichern oftmals vergessen werden auch Downloaddateien. Die Website hat ein abgesichertes Log-in, aber PDFs oder andere Dokumente sind trotzdem ohne Einloggen erreichbar. Die OWASP nennt dies Failure to Restrict URL Access. Hiergegen hilft es, Dateien aus bestimmten Verzeichnissen nicht direkt, sondern nur über den Umweg PHP auszuliefern. Alternativ können Sie natürlich auch die Verzeichnisse per HTTP-Authentizierung schützen.

Konfiguration

Auch bei der Konfiguration des Systems an sich gibt es sicherheitsrelevante Fragen. Eine Regel ist, dem Angreifer so wenig Informa-tionen wie möglich zu geben. Eine phpinfo.php-Datei mit der phpinfo()-Funktion darin sollte also nach dem Test vom Server verschwinden.

Zu den unnötigen Informationen gehören natürlich auch Strukturausgaben und Fehlermeldungen. Das geht aufseiten des Servers los (Directory Listing und so weiter) und reicht bis zu PHP. Auf einem Produktivsystem sollte display_errors immer auf Off stehen. Gleichzeitig aber natürlich Fehlerlogging erfolgen (log_errors auf On). Und das Fehlerlog-Level sollte so hoch wie möglich sein (E_ALL und E_STRICT).

Passwörter

Bei Passwörtern gibt es zum einen gewisse Güteanforderungen an Länge und Zeichenmenge, aus denen sie generiert werden. Dies verhindert, dass Brute-Force-Attacken das Passwort einfach erraten. Letzteres können Sie durch den Einsatz von Captchas und IP-Logging natürlich auch selbst erschweren.

Daneben gibt es allerdings noch Absicherungsmöglichkeiten für das Speichern von Passwörtern. Hier bieten sich Hashes wie MD5 (32-stelliger, hexadezimaler Wert) oder SHA1 (40-stelliger, hexadezimaler Wert) an. Ein String kann mit den Funktionen md5() oder sha1() in den Hash umgewandelt werden. Die Rückumwandlung ist nicht möglich. Zum Vergleich mit den Nutzereingaben, wird dessen Wert einfach ebenfalls umgewandelt und dann mit dem gespeicherten Hash verglichen.

Viel Erfolg!

Dies war der letzte Teil der Serie zur PHP-Zertifizierung. Sollten Sie kein Interesse daran haben, die Zertifizierung abzulegen, konnten Sie hoffentlich trotzdem einiges an Hintergrundwissen über PHP mitnehmen. Sollten Sie dagegen die Zertifizierung anstreben, wünschen wir Ihnen viel Erfolg.

Weitere Vorbereitungsmöglichkeiten

Wem diese Artikelserie noch nicht ausreicht, der kann sich natürlich auch noch ein wenig ausführlicher vorbereiten.

Eine wichtige Quelle ist die PHP-Dokumentation. Und natürlich hilft auch praktische Erfahrung und Übung. Speziell auf die Zertifizierung zugeschnitten sind einige englischsprachige Quellen von Zend: Unter finden Sie den Study Guide in Buchform, außerdem bietet Zend einen (leider kostenpflichtigen) Online-Test ().

Deutschsprachige Trainings bietet Dynamic Web Pages, der offizielle Trainingspartner von Zend für Zentraleuropa (). Bei Zend und bei Dynamic Web Pages gibt es allerdings Bundle-Angebote, die meist auch schon den Voucher für die Zertifizierung selbst enthalten.